14python模块之re
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 = '<a>wahaha</a>' 3 ret = re.findall('>(\w+)<',s) 4 print(ret) # 预期:>wahaha< 实际:wahaha 就是分组优先 5 ret2 = re.findall('>(?:\w+)<',s) #组内最前面加上?:表示取消分组优先 6 print(ret2) # 正常打印
2.2关于分组优先在split中的用法:
# split ret3 = re.split('\d+','john23faker27chuang50') # 切割的内容不会保留 ret4 = re.split('(\d+)','john23faker27chuang50') # 切割的内容会保留 print(ret3) print(ret4)
2.3分组命名
# 分组命名,使用前面的分组 要求使用这个名字的分组和掐面同名分组中的内容匹配的必须一致。(用python也可以直接实现) s = '<a>wahaha</a>' pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' ret = re.search(pattern, s) print(ret)
上述代码,如果将a标签的结束标签改变一下,则会返回None。
2.4.分组在re模块中的方法之search:
1 import re 2 s = '<a>wahaha</a>' 3 ret = re.search('<(\w+)>(\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=' %num 24 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 '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>' 37 '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) 38 39 count = 0 40 for i in range(10): 41 main(count) 42 count += 25