
python正则表达式group⽤法_【Python】正则表达式⽤法
导读:正则在各语⾔中的使⽤是有差异的,本⽂以Python3为基础。本⽂主要讲述的是正则的语法,对于re模块不做过多描述,只会对⼀些特殊地⽅做提⽰。
很多⼈觉得正则很难,在我看来,这些⼈⼀定是没有⽤⼼。其实正则很简单,根据⼆⼋原则,我们只需要懂20%的内容就可以解决80%
的问题了。我曾经有⼏年⼏乎每天都跟正则打交道,刚接⼿项⽬的时候我对正则也是⼀⽆所知,花半⼩时百度了⼀下,然后写了⼏个
demo,就开始正式接⼿了。三年多时间,我⽤到的正则鲜有超出我最初半⼩时百度到的知识的。
1、正则基础
1.1、基础语法
(1)常⽤元字符
语法描述b
匹配单词的开始或结束
d
匹配数字s
匹配任意不可见字符(空格、换⾏符、制表符等),等价于[fnrtv]。w
匹配任意Unicode字符集,包括字母、数字、下划线、汉字等.
匹配除换⾏符(n)以外的任意字符^或A
匹配字符串或⾏的起始位置$或Z
匹配字符串或⾏的结束位置
(2)限定词(⼜叫量词)
语法描述*
重复零次或更多次+
重复⼀次或更多次
重复零次或⼀次
{n}
重复n次{n,}
重复n次或更多次{n,m}
重复n到m次
(3)常疫情防控人员 ⽤反义词
语法描述B
匹配⾮单词的开始或结束
D
匹配⾮数字S
匹配任意可见字符,[^fnrtv]W
匹配任意⾮Unicode字符集
除a、b、c以外的任意字符
(4)字符族
语法描述
[abc]a、b或c
除a、b、c以外的任意字符
[a-zA-Z]
a到z或A到Z[a-d[m-p]]
a到d或m到p,即[a-dm-假如我是风 p](并集)
[a-z&&[def]]
d、e或f(交集)[a-z&&[^bc]]
a到z,除了b和c:[ad-z](减去)[a-z&&[^m-p]]
a到z,减去m到p:[a-lq-z](减去)
以上便是正则的基础内容,下⾯来写两个例⼦看下:s='123abc你好'
('d+',s).group()
('w+',s).group()结果:
123
123abc你好是不是很简单?
1.2、修饰符
修饰符在各语⾔中也是有差异的。
Python中的修饰符:
修饰符描述re.A
匹配ASCII字符类,影响w,W,b,B,d,D
re.I
忽略⼤⼩写re.L
做本地化识别匹配(这个极少极少使⽤)re.M
多⾏匹配,影响和re.S
使.匹配包括换⾏符(n)在内的所有字符re.U
匹配Unicode字符集。与re.A相对,这是默认设置re.X
忽略空格和#后⾯的注释以获得看起来更易懂的正则。(1)re.A
修饰符A使w只匹配ASCII字符,W匹配⾮ASCII字符。s='123abc你好'
('w+',s,re.A).group()
('W+',s,re.A).group()
结果:
123abc你好
但是描述中还有d和D,数试卷反思怎么写 字不都是ASCII字符吗?这是什么意思?别忘了,还有全⾓和半⾓!
s='0123456789'#全⾓数字
('d+',s,re.U).group()结果:
0123456789
(2)re.M
多⾏匹配的模式其实也不常⽤,很少有⼀⾏⾏规整的数据。
s='aaarnbbbrnccc'
l('^[sw]*?$',s)
l('^[sw]*?$',s,re.M)结果:
['aaarnbbbrnccc']#单⾏模式
['aaar','bbbr','ccc']#多⾏模式(3)re.S
这个简单,直接看个例⼦。
s='aaarnbbbrnccc'
l('^.*',s)
l('^.*',s,re.S)
结果:['aaar']
['aaarnbbbrnccc']
(4)re.X⽤法如下:
rc=e(r"""
d+#匹配数字
#和字母
[a-zA-Z]+""",re.X)
('123abc').group()
结果:123abc
注意,⽤了X修饰符后,正则中的所有空格会被忽略,包括正则⾥⾯的原本有⽤的空格。如果正则中有需要使⽤空格,只能⽤s代替。(5)(?aiLmsux)
修饰符不仅可以代码中指定,也可以在正则中指定。(?aiLmsux)员工自愿离职协议书 表⽰了以上所有的修饰符,具体⽤的时候需要哪个就右侧腰疼 在?后⾯加上对应的
字母,⽰例如下,(?a)和re.A效果是⼀样的:s='123abc你好'
('(?a)w+',s).group()
('w+',s,re.A).group()结果是⼀样的:
123abc
123abc1.3、贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的⾏为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。s='aabab'
('a.*b',s).group()#这就是贪婪
('a.*?b',s).group()#这就是懒惰
结果:
aabab
aab简单来说:
所谓贪婪,就是尽可能多的匹配;
所谓懒惰,就是尽可能少的匹配。*、+、{n,}这些表达式属于贪婪;
*?、+?、{n,}?这些表达式就是懒惰(在贪婪的基础上加上?)。
2、正则进阶
2.1、捕获分组
语法描述(exp)
匹配exp,并捕获⽂本到⾃动命名的组⾥(?Pexp)
匹配exp,并捕获⽂本到名称为name的组⾥(?:exp)
匹配exp,不捕获匹配的⽂本,也不给此分组分配组号(?P=name)
匹配之前由名为name的组匹配的⽂本
注意:在其他语⾔或者⽹上的⼀些正则⼯具中,分组命名的语法是(?exp)或(?'name'exp),但在Python⾥,这样写会报错:This
namedgroupsyntaxisnotsupportedinthisregexdialect。Python中正确的写法是:(?Pexp)⽰例⼀:
分组可以让我们⽤⼀条正则提取出多个信息,例如:
s='姓名:张三;性别:男;电话:9'
m=('姓名[::](w+).*?电话[::](d{11})',s)ifm:
name=(1)
phone=(2)
print(f'name:{name},phone:{phone}')结果:
name:张三,phone:⽰例⼆:
(?Pexp)有时还是会⽤到的,(?P=name)则很少情况下会⽤到。我想了⼀个(?P=name)的使⽤⽰例,给⼤家看下效果:
s='''
张三30
9'''
pattern=r'.*?)>(.*?)(?P=name)>'
It=l(pattern,s)结果:
[('name','张三'),('age','30'),('phon描写竹子的诗句 e','9')]
2.2、零宽断⾔
语法描述(?=exp)
匹配exp前⾯的位置(?<=exp)
匹配exp后⾯的位置(?!exp)
匹配后⾯跟的不是exp的位置(?
匹配前⾯不是exp的位置
注意:正则中常⽤的前项界定(?<=exp)和前项否定界定(?
(?<=aaa)#正确
(?<=aaa|bbb)#正确
(?<=aaa|bb)#错误
(?<=d+)#错误
(?<=d{3})#正确2.3、条件匹配
这⼤概是最复杂的正则表达式了。语法如下:语法描述
(?(id/name)yes|no)
如果指定分组存在,则匹配yes模式,否则匹配no模式此语法极少⽤到,印象中只⽤过⼀次。
以下⽰例的要求是:如果以_开头,则以字母结尾,否则以数字结尾。
s1='_abcd's2='abc1'
pattern='(_)?[a-zA-Z]+(?(1)[a-zA-Z]|d)'
(pattern,s1).group()
(pattern,s2).group()
结果:
_abcd
abc12.4、findall
Python中的l是个⽐较特别的⽅法(之所以说它特别,是跟我常⽤的C#做⽐较,在没看注释之前我想当然的掉坑⾥去了)。我们看这个⽅法的官⽅注释:
Returnalistofallnon-overlappingmatchesinthestring.
Ifoneormorecapturinggroupsareprentinthepattern,return
alistofgroups;thiswillbealistoftuplesifthepatternhasmorethanonegroup.
Emptymatchesareincludedintheresult.简单来说,就是
如果没有分组,则返回整条正则匹配结果的列表;
如果有1个分组,则返回分组匹配到的结果的列表;
如果有多个分组,则返回分组匹配到的结果的元组的列表。看下⾯的例⼦:
s='aaa123b鼻子上有痣的女人 bb456ccc'
l('[a-z]+d+',s)#不包含分组
l('[a-z]+(d+)',s)#包含⼀个分组l('([a-z]+(d+))',s)#包含多个分组
l('(?:[a-z]+(d+))',s)#?:不捕获分组匹配结果结果:
['aaa123','bbb456']['123','456']
[('aaa123','123'),('bbb456','456')]
['123','456']
零宽断⾔中讲到Python中前项界定必须是定长的,这很不⽅便,但是配合findall有分组时只取分组结果的特性,就可以模拟出⾮定长前
项界定的效果了。结语
其实正则就像是⼀个数学公式,会背公式不⼀定会做题。但其实这公式⼀点也不难,⾄少⽐学校⾥学的数学简单多简爱心得体会 了,多练习⼏次也就会了。

本文发布于:2023-04-12 00:28:22,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1681230503126985.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:正泽学校.doc
本文 PDF 下载地址:正泽学校.pdf
| 留言与评论(共有 0 条评论) |