re模块 常用函数

Posted nbk-zyc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re模块 常用函数相关的知识,希望对你有一定的参考价值。

1. findall() 函数 

1 find(正则表达式,‘待匹配的字符串’)  #返回匹配到字符串,并存放在列表中

  详解见:https://www.cnblogs.com/nbk-zyc/p/11113328.html

技术图片
1 import re
2 
3 ret = re.findall(www.(baidu|oldboy).com, www.oldboy.com)
4 print(ret)  # [‘oldboy‘]     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
5 
6 ret = re.findall(www.(?:baidu|oldboy).com, www.oldboy.com)
7 print(ret)  # [‘www.oldboy.com‘]
练习 findall() 与分组

2. search() 函数

1 import re
2 ret = re.search(abc, this is abcABC).group()
3 print(ret) #结果 : ‘abc‘
4 # 函数会在字符串内按规则匹配,当找到第一个匹配结果时就结束查找,然后返回一个包含匹配信息的对象,该对象可以 通过   调用group()方法   得到匹配的字符串, 
5 # 如果没有匹配到字符串,则返回None
1 obj = re.compile(\\d3)  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
2 ret = obj.search(abc123eeee) #正则表达式对象调用search,参数为待匹配的字符串
3 print(ret.group())  #结果 : 123

3. match() 函数

1 import re
2 ret = re.match(this, this is abcABC).group()
3 print(ret) #结果 : ‘this‘
4 # 在字符串开始处 就按规则匹配,其它 与search()函数使用方法一样

4 finditer() 函数

1 import re
2 ret = re.finditer(\\d, ds3sy4784a)   #finditer返回一个存放匹配结果的迭代器
3 print(ret)  # <callable_iterator object at 0x10195f940>
4 print(next(ret).group())  #查看第一个结果  ‘3‘
5 print(next(ret).group())  #查看第二个结果  ‘4‘
6 print([i.group() for i in ret])  #查看剩余的匹配结果 [‘7‘, ‘8‘, ‘4‘]

5 sub() 和 subn() 函数

1 import re
2 ret = re.sub(\\d, H, eva3egon4yuan4, 1)#将数字替换成‘H‘,参数1表示只替换1个
3 print(ret) #evaHegon4yuan4
4 
5 ret = re.subn(\\d, H, eva3egon4yuan4)
6 print(ret)
7 #将数字替换成‘H‘,返回元组(替换的结果,替换了多少次),即(‘evaHegonHyuanH‘, 3)

6 split() 函数

1 ret = re.split([ab], abcd)  # 先按‘a‘分割得到‘‘和‘bcd‘,在对‘‘和‘bcd‘分别按‘b‘分割
2 print(ret)  # [‘‘, ‘‘, ‘cd‘]
技术图片
1 ret=re.split("\\d+","eva3egon4yuan")
2 print(ret) #结果 : [‘eva‘, ‘egon‘, ‘yuan‘]
3 
4 ret=re.split("(\\d+)","eva3egon4yuan")
5 print(ret) #结果 : [‘eva‘, ‘3‘, ‘egon‘, ‘4‘, ‘yuan‘]
6 
7 #在匹配部分加上()之后所切出的结果是不同的,
8 #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,
9 #这个在某些需要保留匹配部分的使用过程是非常重要的。
练习-split() 与分组

扩展练习

技术图片
 1 ret = re.search("<(?P<tag_name>\\w+)>\\w+</(?P=tag_name)>","<h1>hello</h1>")
 2 #还可以在分组中利用 ?P<name>的形式给分组起名字
 3 #获取的匹配结果可以直接用group(‘名字‘)拿到对应的值
 4 print(ret.group(tag_name))  #结果 :h1
 5 print(ret.group())  #结果 :<h1>hello</h1>
 6 
 7 ret = re.search(r"<(\\w+)>\\w+</\\1>","<h1>hello</h1>")
 8 #如果不给组起名字,也可以用  \\序号   来找到对应的组,表示要找的内容和前面的组内容一致
 9 #获取的匹配结果可以直接用group(序号)拿到对应的值
10 print(ret.group(1)) #结果 :h1
11 print(ret.group())  #结果 :<h1>hello</h1>
匹配标签
技术图片
 1 import re
 2 
 3 #匹配数字
 4 ret=re.findall(r"\\d+","1-2*(60+(-40.35/5)-(-4*3))")
 5 print(ret) #[‘1‘, ‘2‘, ‘60‘, ‘40‘, ‘35‘, ‘5‘, ‘4‘, ‘3‘]
 6 
 7 #匹配整数
 8 ret=re.findall(r"-?\\d+\\.\\d*|(-?\\d+)","1-2*(60+(-40.35/5)-(-4*3))")
 9 print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘‘, ‘5‘, ‘-4‘, ‘3‘]
10 ret.remove("")
11 print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘5‘, ‘-4‘, ‘3‘]
12 
13 #匹配实数
14 ret=re.findall(r"-?\\d+\\.\\d*|-?\\d+","1-2*(60+(-40.35/5)-(-4*3))")
15 print(ret) #[‘1‘, ‘-2‘, ‘60‘, ‘-40.35‘, ‘5‘, ‘-4‘, ‘3‘]
匹配数字/整数/实数
技术图片
 1 import re
 2 from urllib.request import urlopen
 3 
 4 def getPage(url):
 5     response = urlopen(url)
 6     return response.read().decode(utf-8)
 7 
 8 def parsePage(s):
 9     ret = re.findall(
10         <div class="item">.*?
11         <div class="pic">.*?
12         <em .*?>
13         (?P<id>\\d+).*?
14         <span class="title">(?P<title>.*?)</span>.*?
15         <span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?
16         <span>(?P<comment_num>.*?)评价</span>,s,re.S)
17     return ret
18 
19 def main(num):
20     url = https://movie.douban.com/top250?start=%s&filter= % num    # %s标记每页的首条信息
21     response_html = getPage(url)    #获取网页的全部内容
22     ret = parsePage(response_html) #解析所需求的信息
23     print(ret)
24 
25 count = 0
26 for i in range(10):   # 10页
27     main(count)
28     count += 25        # 每页25条信息
爬取网页-简单版
技术图片
 1 from urllib.request import urlopen
 2 import re
 3 import json
 4 
 5 def getPage(url):
 6     response = urlopen(url)
 7     return response.read().decode(utf-8)
 8 def parsePage(s):
 9     com = re.compile(
10         <div class="item">.*?
11         <div class="pic">.*?
12         <em .*?>
13         (?P<id>\\d+).*?
14         <span class="title">(?P<title>.*?)</span>.*?
15         <span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?
16         <span>(?P<comment_num>.*?)评价</span>, re.S)
17     ret = com.finditer(s)   # finditer返回一个存放匹配结果的迭代器
18     for i in ret:
19         yield 
20             "id": i.group("id"),
21             "title": i.group("title"),
22             "rating_num": i.group("rating_num"),
23             "comment_num": i.group("comment_num"),
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 
31     f = open("move_info7", "a", encoding="utf-8")
32     for obj in ret:
33         print(obj)
34         data = json.dumps(obj, ensure_ascii=False)
35         f.write(data + "\\n")
36     f.close()
37 
38 if __name__ == __main__:
39     count = 0
40     for i in range(10):
41         main(count)
42         count += 25
爬取网页-完整版

 

  

 

以上是关于re模块 常用函数的主要内容,如果未能解决你的问题,请参考以下文章

Python中re模块函数使用介绍

一文秒懂python正则表达式常用函数

Python常用的正则表达式处理函数详解

Python常用的正则表达式处理函数

第六篇:python基础_6 内置函数与常用模块

re模块