一、字符组
1.[0-9]表示匹配0-9中的数字
2.[a-z]表示匹配a-z之间的字母
3.[A-Z]表示匹配大写的字母
4.[0-9a-zA-Z]匹配所有字母数字
二、元字符
1.d 匹配任意数字
2.w 匹配字母数字下划线
3.s 匹配任意空字符
4. 匹配换行符
5. 匹配制表符
6. .(点)匹配除换行符之外的任意字符
7.D 匹配除数字之外的任意字符
8. W 匹配除字母数字下划线之外的任意字符
9.S 匹配非空字符
10.a|b,匹配符合a或b的字符,当条件有重叠时,应该把范围广的放在左边。
11.(),分组匹配,一般搭配RE模块中的findall,search使用表示优先匹配。
12.[...] 匹配字符组中的字符
13 [^...] 匹配除字符组外的字符
三、量词
1.* 表示匹配0-无穷次的字符
2. + 匹配1-无穷次的字符
3. ?表示重复0次或一次,在量词的后面跟了一个 ? 表示取消贪婪匹配 :.*?跟上字符表示匹配任意字符知道找到符合条件的字符就不在找。
4.{n}表示前面的重复n次
5.{n,}表示至少重复n次
6.{n,m}表示重复n-m次,但是以匹配数量多的优先
四、转义符
在python中有特殊意义,比如 表示换行,如果要匹配‘ ’需要在前面加上\,就是'\n'。如果要匹配‘\n’,就是‘\\n’两个\。如果有多个\就要加几个\会有点麻烦,所以只需要在前面加r',r' 就可以了。
五、re模块的常用方法
1. findall
import re # ret = re.findall('-0.d+|-[1-9]d*(.d+)?','-1asdada-200')#前面是正则表达式,后面是待匹配的字符
ret = re.finditer('d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
# ret1 = re.findall('www.(oldboy).com','www.oldboy.com')#会优先匹配括号里的正则表达式,结果:oldboy,(:?oldboy):?表示取消优先匹配
# print(ret)#返回列表
2.search
# ret = re.search('d+(.d+)(.d+)(.d+)?','1.2.3.4-2(60(-40.35/5)-(-4*3))')
# print(ret.group())
# print(ret.group(1))
# print(ret.group(2))
# print(ret.group(3))
#search可以节省内存,但是打印时要加上.group(),(1)表示显示第一个,不加数字表示显示全部
3.spilt
# ret = re.split('d+','alex83egon20taibai40') # print(ret)
按照匹配到的结果进行切割
4.分组命名
# ret = re.search(r'<(?P<tag>w+)>(?P<c>w+)</(w+)>',r'<a>wahaha</b>') # print(ret.group()) # print(ret.group('tag')) # print(ret.group('c'))
?P<名字>,可以给匹配到的内容命名,这样.group(名字),可以输出指定名字的内容
5.爬虫练习
import re from urllib.request import urlopen # 内置的包 来获取网页的源代码 字符串 # res = urlopen('http://www.cnblogs.com/Eva-J/articles/7228075.html') # print(res.read().decode('utf-8')) def getPage(url):#请求内容 response = urlopen(url) return response.read().decode('utf-8') def parsePage(s): # 获取 网页源码
com = re.compile(
'<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>'
'.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S)
ret = com.finditer(s)#节省内存 for i in ret: ret = { "id": i.group("id"), "title": i.group("title"), "rating_num": i.group("rating_num"), "comment_num": i.group("comment_num") } yield ret def main(num): url = 'https://movie.douban.com/top250?start=%s&filter=' % num # 0 response_html = getPage(url) # response_html是这个网页的源码 str ret = parsePage(response_html) # 生成器 print(ret) f = open("move_info7", "a", encoding="utf8") for obj in ret: print(obj) data = str(obj) f.write(data + " ") f.close() com = re.compile( '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>' '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) count = 0 for i in range(10): main(count) # count = 0 count += 25