python之正则表达式
第一章 re模块
1.什么是正则?
和shell中的差不多
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
元字符 |
匹配内容 |
---|---|
\w | 匹配字母(包含中文)或数字或下划线 |
\W | 匹配非字母(包含中文)或数字或下划线 |
\s | 匹配任意的空白符 |
\S | 匹配任意非空白符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\A | 从字符串开头匹配 |
\z | 匹配字符串的结束,如果是换行,只匹配到换行前的结果 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 匹配字符组中的字符 |
[^] | 匹配除了字符组中的字符的所有字符 |
* | 匹配0个或者多个左边的字符。 |
+ | 匹配一个或者多个左边的字符。 |
? | 匹配0个或者1个左边的字符,非贪婪方式。 |
精准匹配n个前面的表达式。 | |
匹配n到m次由前面的正则表达式定义的片段,贪婪方式 | |
ab | 匹配a或者b |
() | 匹配括号内的表达式,也表示一个组 |
第二章 练习
#从字符串中全部查找内容,返回的是列表
s = 'zbb张'
print(re.findall('zbb',s))
#['zbb']
s = 'zbb张'
#查找数字字母(中文),下划线
print(re.findall('\w',s))
#['z', 'b', 'b', '张']
#查找非数字,字母(中文),下划线
s = 'zbb张@!'
print(re.findall('\W',s))
#['@', '!']
# 查找任意空格,换行符,制表符
s = 'zbb张 @!\n \t'
print(re.findall('\s',s))
#[' ', '\n', ' ', '\t']
# 查找非任意空格,换行符,制表符
s = 'zbb张 @!\n \t'
print(re.findall('\S',s))
# ['z', 'b', 'b', '张', '@', '!']
# 查找数字
s = 'z12bb张 @!\n \t'
print(re.findall('\d',s))
# ['1', '2']
# 查找非数字
s = 'z12bb张 @!\n \t'
print(re.findall('\D',s))
# ['z', 'b', 'b', '张', ' ', '@', '!', '\n', ' ', '\t']
# 查找是否以什么开头的内容
s = 'z12bb张_zbb @!\n \t'
print(re.findall('^z',s))
# print(re.findall('\Az',s))
# ['z']
# 查找是否以什么结尾的内容
s = 'z12bb张_zbb @!'
print(re.findall('!$',s))
# print(re.findall('!\Z',s))
# ['!']
# 查找换行符,制表符
s = 'z12bb张_zbb \n \t@!'
print(re.findall('\n',s))
print(re.findall('\t',s))
# ['\n']
# ['\t']
# .只能匹配任意一个内容(非换行符)
s = 'z\nb12bb张_z\tb \n \t@!'
print(re.findall('z.b',s))
print(re.findall('z.b',s,re.DOTALL)) #可以匹配到换行符
# ['z\tb']
# ['z\nb', 'z\tb']
s = 'z\nb12bbA张_z\tb \n \t@!'
print(re.findall("[a-z]",s)) # 小写的a,z
print(re.findall("[A-Z]",s)) # 大写的A,Z
print(re.findall("[A-Za-z]",s)) # 大写和小写的a,z A,Z
print(re.findall("[a-z0-9]",s)) # 小写的a,z 数字 0,9
# ['z', 'b', 'b', 'b', 'z', 'b']
# ['A']
# ['z', 'b', 'b', 'b', 'A', 'z', 'b']
# ['z', 'b', '1', '2', 'b', 'b', 'z', 'b']
# 查找非a-z的元素
s = 'z\nb12bbA张_z\tb \n \t@!'
print(re.findall("[^a-z]",s))
# ['\n', '1', '2', 'A', '张'...]
# * 匹配 0个多个 [贪婪匹配]
s = 'z\nb12bbA张_z\tb \n \t@!'
print(re.findall("z*",s))
#print(re.findall("z*b",s))
# 匹配 1个多个 [贪婪匹配]
s = 'zzzzb12bbA张_zb \n \t@!'
print(re.findall("z+",s))
#['zzzz', 'z']
# ? 匹配 0个或1个 [非贪婪匹配]
s = 'zb12bbA张_zb \n \t@!'
print(re.findall("z?",s))
#['z', '', '', '', '', 'z', '', '....]
# s重复2次
s = 'zb12bbA张_zbb \n \t@!'
print(re.findall("b{2}",s))
#['bb', 'bb']
# 指定最少多少次,最多多少次
s = 'zb12bbA张_zzbbzzz \n \t@!'
print(re.findall("z{1,3}",s))
#['z', 'zz', 'zzz']
# a|b 或
s = 'zb12bbA张_zzbbzzz \n \t@!'
print(re.findall("z|b",s))
#['z', 'b', 'b', 'b', 'z', 'z', 'b', 'b', 'z', 'z', 'z']
# ?: 可以反回括号外的东西
s = "meet_assdf_mssst_(.)mmns_aaamaaatmsssssssssssstt"
print(re.findall("m(?:..)t",s))
s = 'zaq_sb wqe_sb ritian_sb'
print(re.findall("\w+_sb",s))
# print(re.findall("[a-z]+_sb",s))
# ['zaq_sb', 'wqe_sb', 'ritian_sb']
第三章 常用方法
1. findall
全部找到返回一个列表
s = 'zaq_sb wqe_sb ritian_sb'
print(re.findall("zaq",s))
2.search
从字符串中任意位置进行匹配查找到一个就停止了,返回的是一个对象. 获取匹配的内容必须使用.group()进行获取
s = 'zaq_sb wqe_sb ritian_nb'
print(re.search("sb|nb",s).group())
3.match
从字符串开始位置进行匹配
#match 找到1个后就停止查找了,只从字符串的开头查找.找到后返回的是一个对象,查看元素.group()
s = 'zaq_sb wqe_sb ritian_nb'
print(re.match("zaq",s).group())
#zaq
#没有hui报错
4.spilit 分割
s = 'zaq_sb w:qe_sb#rit!ian_*nb'
print(re.split("[#,:!*]",s))
5.sub 替换
print(re.sub("barry","太亮",'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'))
6.compile
定义匹配规则(无用)
obj = re.compile("\w")
print(obj.findall("zbb只能给你"))
7.finditer
返回的是一个迭代器
g = re.finditer("\w","zbb:可是我还你想啊!")
print(next(g).group())
for i in g:
print(i.group())
8.给分组起名字
print(re.search("(?P<tag_name>\w+)\w+\w+","h1hellh1"))
print(re.search("(?P<aaa>\w+)dfa","asbsadfasdfa").group("aaa"))
print(re.search("(?P<cx>\w+)dfa","asbsadfasdfa").group())
热爱技术,享受生活,感谢推荐!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?