python开发模块基础:re正则
一,re模块的用法
#findall #直接返回一个列表
#正常的正则表达式
#但是只会把分组里的显示出来
#search #返回一个对象 .group()
#match #返回一个对象 .group()
1 import re 2 #re模块的用法 3 4 ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里 5 print(ret) #结果 : ['a', 'a'] 6 7 ret = re.search('a', 'eva egon yuan').group() 8 print(ret) #结果 : 'a' 9 # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以 10 # 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。 11 12 ret = re.match('a', 'abc').group() # 同search,不过尽在字符串开始处进行匹配 13 print(ret) 14 #结果 : 'a' 15 16 ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 17 print(ret) # ['', '', 'cd'] 18 19 ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个 20 print(ret) #evaHegon4yuan4 21 22 ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次) 23 print(ret) 24 25 obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 26 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 27 print(ret.group()) #结果 : 123 28 29 import re 30 ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 31 print(ret) # <callable_iterator object at 0x10195f940> 32 print(next(ret).group()) #查看第一个结果 33 print(next(ret).group()) #查看第二个结果 34 print([i.group() for i in ret]) #查看剩余的左右结果 35 36 #注意: 37 #1 findall的优先级查询 38 import re 39 40 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') 41 print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 42 43 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') 44 print(ret) # ['www.oldboy.com'] 45 46 #2 split的优先级查询 47 ret=re.split("\d+","eva3egon4yuan") 48 print(ret) #结果 : ['eva', 'egon', 'yuan'] 49 50 ret=re.split("(\d+)","eva3egon4yuan") 51 print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] 52 53 #在匹配部分加上()之后所切出的结果是不同的, 54 #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, 55 #这个在某些需要保留匹配部分的使用过程是非常重要的。 56 57 #findall #直接返回一个列表 58 #正常的正则表达式 59 #但是只会把分组里的显示出来 60 61 #search #返回一个对象 .group() 62 #match #返回一个对象 .group()
练习题
1 #!/usr/bin/python env 2 #_*_coding:utf-8_*_ 3 4 #1、匹配标签 5 import re 6 ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") 7 #还可以在分组中利用?<name>的形式给分组起名字 8 #获取的匹配结果可以直接用group('名字')拿到对应的值 9 print(ret.group('tag_name')) #结果 :h1 10 print(ret.group()) #结果 :<h1>hello</h1> 11 12 ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>") 13 #如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致 14 #获取的匹配结果可以直接用group(序号)拿到对应的值 15 print(ret.group(1)) 16 print(ret.group()) #结果 :<h1>hello</h1> 17 18 #2、匹配整数 19 import re 20 ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") 21 print(ret) #['1', '2', '60', '40', '35', '5', '4', '3'] 22 ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))") 23 print(ret) #['1', '-2', '60', '', '5', '-4', '3'] 24 ret.remove("") 25 print(ret) #['1', '-2', '60', '5', '-4', '3'] 26 27 #3、数字匹配 28 # 1、 匹配一段文本中的每行的邮箱 29 # http://blog.csdn.net/make164492212/article/details/51656638 30 # 2、 匹配一段文本中的每行的时间字符串,比如:‘1990-07-12’; 31 # 32 # 分别取出1年的12个月(^(0?[1-9]|1[0-2])$)、 33 # 一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 34 # 3、 匹配qq号。(腾讯QQ号从10000开始) [1,9][0,9]{4,} 35 # 4、 匹配一个浮点数。 ^(-?\d+)(\.\d+)?$ 或者 -?\d+\.?\d* 36 # 5、 匹配汉字。 ^[\u4e00-\u9fa5]{0,}$ 37 # 6、 匹配出所有整数
爬豆瓣网页匹配
1 #!/usr/bin/python env 2 #_*_coding:utf-8_*_ 3 import re 4 import json 5 import requests #urlopen 6 7 def getPage(url): 8 response = requests.get(url) 9 return response.text 10 11 def parsePage(s): 12 com = re.compile( 13 '<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>\d+).*?<span class="title">(?P<title>.*?)</span>' 14 '.*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>', re.S) 15 16 ret = com.finditer(s) 17 for i in ret: 18 yield { 19 "id": i.group("id"), 20 "title": i.group("title"), 21 "rating_num": i.group("rating_num"), 22 "comment_num": i.group("comment_num"), 23 } 24 25 def main(num): 26 url = 'https://movie.douban.com/top250?start=%s&filter=' % num 27 response_html = getPage(url) 28 ret = parsePage(response_html) 29 print(ret) 30 f = open("move_info7", "a", encoding="utf8") 31 32 for obj in ret: #循环生成器 33 print(obj) 34 data = json.dumps(obj, ensure_ascii=False) 35 f.write(data + "\n") 36 37 count = 0 38 for i in range(10): 39 main(count) 40 count += 25