一、正则表达式的概念
1.使用单个字符串来描述匹配一系列符合某个句法规则的字符串;
2.是对字符串操作的一种逻辑公式;
3.其应用场景为处理文本和数据;
4.正则表达式的执行过程:依次拿出表达式和文本中的字符串比较,如果每个字符都能匹配成功,则匹配成功;否则匹配失败。
二、re模块
1.编写第一个正则表达式:
(1)import re #导入正则表达式模块
(2)正则表达式执行 过程及关键函数(涉及两个对象:规则对象、匹配对象)
使用compile函数创建正则表达式对象
使用match或search等简单方法实现匹配和搜索
检查匹配结果
(3)示例:
import re
pattern = re.compile(r'^q') #是否以q开头,r表示为原生字符串
result = pattern.match('qazxs') #如果没有匹配成功,则会返回空
result.group() #匹配结果放在元组中
print result.string
三、语法
1.匹配字符
字符 作用
(1)字符匹配
. 匹配任意字符
[……] 中括号中任选一个,可写为[123456] 或[1-6]含义相同
\d / \D 匹配数字 / 非数字
\w / \W 匹配字母数字 / 匹配除过字母数字的内容
\s / \S 匹配空格 / 匹配除空格外的其他字符
(2)次数匹配
* 匹配前一个字符0次或多次
+ 匹配前一个字符1次或多次
? 匹配前一个字符0次或1次
{m} / {m,n} 匹配前一个字符m次,或[m,n] 次(少于匹配次数匹配失败;多余匹配字数,则只匹配限定个字符)
*? / +? / ?? 匹配模式变为非贪婪模式(尽可能少匹配字符)(只要前面匹配上,则后面能不匹配就不匹配)
(3)边界匹配
^ 匹配字符串开头
$ 匹配字符串结尾
\A / \Z 指定的字符串必须出现在开头/结尾
| 匹配左右任意一个表达式
(ab) 括号中表达式作为一个分组
\<number> 引用编号为number的分组匹配到的字符串
(?\P<number>) 为分组起一个别名
(?P=name) 引用别名为name的分组匹配的字符串
#(?p<name>)与(?p=name)示例 import re ma = re.match(r'<([\w]+>)[\w]+</\1',"<book>python</book>") ma.group() #输出存入分组的结果 ma = re.match(r'<(?P<bookname>[\w]+>)[\w]+</(?P=bookname)',"<book>python</book>") ma.group()
四、re模块相关方法使用
1.search(pattern,str,flags) #用于查找模式串在str中第一次出现的位置
#匹配字符串中一部分数据 str1 = 'videonum = 1000' ma = re.search(r'\d+',str1) ma.group() # 输出:1000
2.findall(pattern,str,flags) # 找到匹配返回所有匹配的列表
str1 = "c++=100,java=99,python=80" ma = re.findall(r'[\d]+',str1) ma #['100', '99', '80']
3. sub(pattern,repl,string,count=0,flags=0) #将字符串中匹配正则表达式的部分替换为其他值
4.split(pattern,string,maxsplit=0,flags=0) #根据匹配分割字符串,返回分割字符串组成的列表
五、re模块相关练习(抓取网页中的图片到本地)
1.抓取网页地址
import urllib2 req = urllib2.urlopen("http://www.imooc.com/course/list") buf = req.read()
2.获取图片地址
import re listurl = re.findall(r'http:.+\.jpg',buf)
3.抓取图片内容保存到本地
i = 0 for url in listurl: f = open(str(i)+'.jpg','w') req = urllib2.urlopen(url) buf = req.read() f.write(buf) i+=1