re模块
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')) # 不在起始位置不匹配
-
re.search("匹配规则", "要匹配的字符串")
- 匹配成功re.search方法返回一个匹配的对象,否则返回None。
- 从头到尾从头匹配字符串中取出第一个符合条件的项.
- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
import re ret = re.serch('\d','alex83') print(ret) if ret: print(ret.group()) #如果返回对象,用group取值
-
re.findall("匹配规则", "要匹配的字符串")
- 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表
- 如果没有找到匹配的,则返回空列表。
-
re.finditer
- 读大文件使用finditer节省内存,结果比较多的时候使用
- 返回值与findall类似
import re
ret = re.finditer('\d','asfjsdf12jidfiewjfi'*200000) #ret是一个迭代器
for i in ret: #迭代出来的每一项都是一个对象
print(i.group()) #通过group取值即可
-
re.compile 编译方法
- 在同一个正则表达式重复使用多次的时候使用compile能减少使用时间开销
import re s= 'asfjsdf12jidfiewjfi' ret = re.compile('\d+') r1 = ret.seach('alex83') r2 = ret.findall('wusir73')
-
扩展
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 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)
-
分组编号
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)) # 取第二个分组中的内容
-
分组命名
-
(?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'))
-
-
引用分组
- 引用分组 (?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'))
#经典例题
#有的时候我们想匹配的内容包含在不相匹配的内容当中,这个时候只需要把不想匹配的先匹配出来,再通过手段去掉
import re
ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret)
ret.remove('')
print(ret)
2 flags
编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
标志 | 含义 |
---|---|
re.S(DOTALL) | 使.匹配包括换行在内的所有字符 |
re.I(IGNORECASE) | 使匹配对大小写不敏感 |
re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等 |
re.M(MULTILINE) | 多行匹配,影响^和$ |
re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 |
re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B |
#示例
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
3 转义符
- r或者\为转义符
- 正则表达式中的转义符在python的字符串中也有转义的作用
- 所有的正则都已在工具中的测试结果为结果,在所有结果前加r
\\n
匹配\n
===>r'\n'
\\\\n
匹配\\n
===>r'\\n'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类