1、re模块的基础方法
1.1查找
findall:返回列表 找到所有的匹配项
search:匹配成功就返回一个变量,通过group取匹配到的第一个值,不匹配就返回None,group报错
1 ret2 = re.search('\d+','asd123sdf43asd23')2 print(ret2) # 打印的是内存地址,这是一个正则匹配的结果3 print(ret2.group()) #通过ret.group()来获取真正的结果
match:相当鱼search的正则表达式中加了一个'^',其余没有区别
1.2切割和替换
split:返回列表,按照正则规则去切割,默认匹配到的内容会被切割
1 s = 'john23faker27chuang50'2 ret3 = re.split('\d+',s)3 print(ret3)4 5 #打印结果为:['john', 'faker', 'chuang', '']
sub/subn:替换,按照正则规则去寻找要被替换掉的内容,subn返回元祖,第二个值是替换的次数
# sub替换 (正则,替换的结果,需要替换的内容,替换的次数)ret4 = re.sub('\d+', 'H', 'john23faker27chuang50', 1)print(ret4)打印结果为:johnHfaker27chuang50
1.3编译和迭代器
compile:编译一个正则表达式,用这个结果去search math findall finditer 能够节省时间
finditer:返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值,能够节省内存
2、关于分组在re模块中的使用
2.1关于分组优先在findall中的用法:---(\w+)
1 #python正则默认分组优先:(这个和正则本身无关)2 s = 'wahaha'3 ret = re.findall('>(\w+)<',s)4 print(ret) # 预期:>wahaha< 实际:wahaha 就是分组优先5 ret2 = re.findall('>(?:\w+)<',s) #组内最前面加上?:表示取消分组优先6 print(ret2) # 正常打印
2.2关于分组优先在split中的用法:
# splitret3 = re.split('\d+','john23faker27chuang50') # 切割的内容不会保留ret4 = re.split('(\d+)','john23faker27chuang50') # 切割的内容会保留print(ret3)print(ret4)
2.3分组命名
# 分组命名,使用前面的分组 要求使用这个名字的分组和掐面同名分组中的内容匹配的必须一致。(用python也可以直接实现)s = 'wahaha'pattern = '<(?P\w+)>(\w+) 'ret = re.search(pattern, s)print(ret)
上述代码,如果将a标签的结束标签改变一下,则会返回None。
2.4.分组在re模块中的方法之search:
1 import re2 s = 'wahaha'3 ret = re.search('<(\w+)>(\w+) ',s)4 print(ret.group()) # 所有的结果5 print(ret.group(1))6 print(ret.group(2))7 print(ret.group(3))
这是最基础的通过.group(index)来取分组中的内容
如果给分组起名字的话,也可以直接通过.group(name)来取分组中的内容( 正则(?P<name>正则) 使用这个分组 ?P=name)
3、用正则写的一个简易爬虫demo
纯正则提取,函数写。
1 # coding:utf-8 2 import re 3 from urllib.request import urlopen 4 5 6 def getPage(url): # 获取整个html的字符串 7 response = urlopen(url) 8 return response.read().decode('utf-8') 9 10 11 def parsePage(s):12 ret = com.finditer(s) # 从这个html中,找到所有符合com正则表达式规则的内容并且以迭代器的形式返回13 for i in ret:14 yield {15 "id": i.group("id"),16 "title": i.group("title"),17 "rating_num": i.group("rating_num"),18 "comment_num": i.group("comment_num")19 }20 21 22 def main(num):23 url = 'https://movie.douban.com/top250?start=%s&filter=' %num24 response_html = getPage(url)25 ret = parsePage(response_html)26 print(ret)27 f = open("move_info7", "a", encoding="utf8")28 29 for obj in ret:30 print(obj)31 data = str(obj)32 f.write(data + "\n")33 34 35 com = re.compile(36 '.*?.*? (?P\d+).*? (?P .*?)</span>'37 '.*? .*?(?P.*?)评价 ', re.S)38 39 count = 040 for i in range(10):41 main(count)42 count += 25