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

 

posted @ 2017-08-09 21:53  liqianlong  阅读(285)  评论(0编辑  收藏  举报