一、re模块的核心功能
1、findall —— 查找所有,返回list
1 lst = re.findall("m", "mai le fo len, mai ni mei!") 2 print(lst) # ['m', 'm', 'm'] 3 lst = re.findall(r"d+", "5点之前. 你要给我5000万") 4 print(lst) # ['5', '5000']
2、finditer —— 和findall差不多,返回的是迭代器
1 it = re.finditer("m", "mai le fo len, mai ni mei!") 2 for el in it: 3 print(el.group()) # 依然需要分组
3、search —— 会进行批评,但是如果匹配到了第一个结果,就返回这个结果。如果匹配不上search返回None
1 ret = re.search(r'd', '5点之前. 你要给我5000万').group() 2 print(ret) # 5
4、match —— 只能从字符串的开头进行匹配
1 ret = re.match('a', 'abc').group() 2 print(ret) # a
5、其他操作
1 ret = re.split('[ab]', 'qwerafjbcd') # 先按'a'分割得到'qwer'和'fjbcd',在对'qwer'和'fjbcd'分别按'b'分割 2 print(ret) # ['qwer', 'fj', 'cd'] 3 4 ret = re.sub(r"d+", "_sb_", "alex250taibai250wusir250ritian38") # 把字符串中的数字换成__sb__ 5 print(ret) # alex_sb_taibai_sb_wusir_sb_ritian_sb_ 6 7 ret = re.subn(r"d+", "_sb_", "alex250taibai250wusir250ritian38") # 将数字替换成'__sb__',返回元组(替换的结果,替换了多少次) 8 print(ret) # ('alex_sb_taibai_sb_wusir_sb_ritian_sb_', 4) 9 10 obj = re.compile(r'd{3}') # 将正则表达式编译成为⼀个 正则表达式对象, 规则要匹配的是3个数字 11 ret = obj.search('abc123eeee') # 正则表达式对象调⽤search, 参数为待匹配的字符串 12 print(ret.group()) # 结果: 123
6、爬虫(重点)
1 obj = re.compile(r'(?P<id>d+)(?P<name>e+)') # 从正则表达式匹配的内容每个组起名字 2 ret = obj.search('abc123eeee') # 搜索 3 print(ret.group()) # 结果: 123eeee 4 print(ret.group("id")) # 结果: 123 # 获取id组的内容 5 print(ret.group("name")) # 结果: eeee # 获取name组的内容
注意: 在re模块中和我们在线测试⼯具中的结果可能是不⼀样的
1 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') 2 print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组⾥内容返回,如果想要匹配结果,取消权限即可 3 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') 4 print(ret) # ['www.oldboy.com'] 5 6 ret=re.split("d+","eva3egon4yuan") 7 print(ret) #结果 : ['eva', 'egon', 'yuan'] 8 ret=re.split("(d+)","eva3egon4yuan") 9 print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] 10 #在匹配部分加上()之后所切出的结果是不同的, 11 #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, 12 #这个在某些需要保留匹配部分的使⽤过程是⾮常重要的。
爬取豆瓣网
1 import ssl 2 import re 3 from urllib.request import urlopen 4 5 ssl._create_default_https_context = ssl._create_unverified_context # ⼲掉数字签名证书 6 def getPage(url): 7 response = urlopen(url) 8 return response.read().decode('utf-8') 9 10 def parsePage(s): 11 com = re.compile(com = re.compile( 12 '<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>'+ 13 '(?P<comment_num>.*?)评价</span>', re.S) 14 ret = com.finditer(s) 15 for i in ret: 16 yield { 17 "id": i.group("id"), 18 "title": i.group("title"), 19 "rating_num": i.group("rating_num"), 20 "comment_num": i.group("comment_num"), 21 } 22 def main(num): 23 url = 'https://movie.douban.com/top250?start=%s&filter=' % num 24 response_html = getPage(url) 25 print(response_html) 26 ret = parsePage(response_html) 27 # # print(ret) 28 f = open("move_info7", "a", encoding="utf8") 29 for obj in ret: 30 print(obj) 31 data = str(obj) 32 f.write(data + " ") 33 34 35 count = 0 36 for i in range(10): 37 main(count) 38 count += 25