re模块
# 1.re模块
re模块本身是用来操作正则表达式,与正则本身没有关系
正则表达式是用来匹配处理字符串的 python 中使用正则表达式需要引入re模块
如:
import re #第一步,要引入re模块
re.match(pattern表达式规则, string)
从头开始,等同于re.search加上^号
如果不是起始位置匹配成功的话,match()就返回none.
匹配成功re.match方法返回一个匹配的对象,否则返回None。
import re print(re.match('www', 'www.runoob.com')) # 在起始位置匹配 print(re.match('com', 'www.runoob.com')) # 不在起始位置不匹配
1
2
3re.search("匹配规则", "要匹配的字符串")
- 匹配成功re.search方法返回一个匹配的对象,否则返回None。
- 从头到尾从头匹配字符串中取出第一个符合条件的项.
- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
import re ret = re.serch('\d','alex83') print(ret) if ret: print(ret.group()) #如果返回对象,用group取值
1
2
3
4
5re.findall("匹配规则", "要匹配的字符串")
- 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表
- 如果没有找到匹配的,则返回空列表。
re.finditer
- 读大文件使用finditer节省内存,结果比较多的时候使用
- 返回值与findall类似 ,返回的是对象
import re
ret = re.finditer('\d','asfjsdf12jidfiewjfi'*200000) #ret是一个迭代器
for i in ret: #迭代出来的每一项都是一个对象
print(i.group()) #通过group取值即可
1
2
3
4
2
3
4
re.compile 编译方法
- 在同一个正则表达式重复使用多次的时候使用compile能减少使用时间开销
import re s= 'asfjsdf12jidfiewjfi' ret = re.compile('\d+') r1 = ret.seach('alex83') r2 = ret.findall('wusir73')
1
2
3
4
5扩展
#search import re # ret = re.search("<(?P<tag_name>\w+)>\w+</w+>","<h1>hello</h1>") # print(ret.group('tag_name')) # print(ret.group()) ret = re.search("<(?P<tag_name1>\w+)>\w+</\w+>","<h1>hello</h1>") #还可以在分组中利用?的形式给分组起名字 #获取的匹配结果可以直接用group('名字') 拿到对应的值 print(ret.group('tag_name1')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1>
1
2
3
4
5
6
7
8
9
10split 根据正则切割,-
默认不保留切割内容
保留正则中分组内匹配到的内容
# 2.转义符
r或者\为转义符
正则表达式中的转义符在python的字符串中也有转义的作用
所有的正则都已在工具中的测试结果为结果,在所有结果前加r
\\n
匹配\n
===>r'\n'
\\\\n
匹配\\n
===>r'\\n'
# 3.进阶方法
# 3.1时间复杂度
- 效率
# 3.2空间复杂度
- 内存占用
# 3.3用户体验
- 体验
# 4.re模块分组
findall 遇到分组时,优先显示分组中的内容
?: 取消分组优先展示
import re s1 = '1-2*(60+(-40.35/5)-(-4*3))' res=re.compile(r'\d+\.\d+?|(?:\d+)') ret=re.findall(res,s1) # ret.remove('') print(ret)
1
2
3
4
5
6分组编号
s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' import re ret = re.search('<(\w+)>(.*?)</\w+>',s1) print(ret) print(ret.group(0)) # group参数默认为0表示取整个正则匹配的结果 print(ret.group(1)) # 取第一个分组中的内容 print(ret.group(2)) # 取第二个分组中的内容
1
2
3
4
5
6
7
8
9分组命名
(?P<名字>正则表达式)
s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' ret = re.search('<(?P<tag>\w+)>.*?</(?P<tag2>\w+)>',s1) #(?P<tag>) print(ret.group('tag'))
1
2
3
4
引用分组
- 引用分组 (?P=组名) 这个组中的内容必须完全和之前已经存在的组匹配到的内容一模一样
s1 = '<h1>wahaha</h1>' s2 = '<a>wahaha ya wahaha</a>' ret = re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',s1) #(?P=tag) print(ret.group('tag'))
1
2
3
4
#经典例题
#有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉
import re
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret.remove('')
print(ret)
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5.flags
编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
标志 | 含义 |
---|---|
re.S(DOTALL) | 使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE) | 使匹配对大小写不敏感 |
re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等![img](file:///C:/Users/tina/AppData/Local/YNote/data/heoffer@126.com/15ef610b4afd4cf0aea99402f970595e/19c23298f53f40f1b1d0168871156605.jpg) |
re.M(MULTILINE) | 多行匹配,影响^和$ |
re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
#示例
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
1
2
3
4
5
6
2
3
4
5
6
# 6.爬虫小示例
![ 1557030053403](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1557030053403.png)
#豆瓣top250爬取
1
2
2
![1557030477523](C:\Users\big cattle\AppData\Roaming\Typora\typora-user-images\1557030477523.png)
上次更新: 2023/04/16, 18:35:33