说说 Python 正则表达式的匹配类型
发布日期:2021-06-29 21:02:32 浏览次数:4 分类:技术文章

本文共 2313 字,大约阅读时间需要 7 分钟。

1 管道匹配

1.1 匹配多个表达式

如果希望匹配多个表达式中的一个时, 可以使用管道匹配字符 |

name_regex=re.compile(r'地球|火箭')mo=name_regex.search('英媒称,过不了多久,人们也许可以搭乘火箭,看见整个地球。')print(mo.group())mo=name_regex.search('英媒称,过不了多久,人们也许在地球之上看见它,以火箭的方式。')print(mo.group())print(name_regex.findall('英媒称,过不了多久,人们也许可以搭乘火箭,看见整个地球。'))

运行结果:

火箭

地球
[‘火箭’, ‘地球’]

从以上示例中我们可以看出,如果 “地球” 和 “火箭” 都出现在被查找的字符串中, 那么 search() 方法会返回包含第一次出现的匹配文本的 Match 对象。

可以利用 findall() 方法,找出“所有”匹配的文本。

1.2 匹配多个模式

组合使用管道与括号,可以实现匹配多个模式。

name_regex = re.compile(r'in(novative|flight)')mo = name_regex.search(    'A new seat design comes with an innovative solution to this inflight issue, using "padded wings" that fold out from behind both sides of the seat back -- allowing both for additional privacy and a cushioned spot to rest heads for some shut-eye.')print(mo.group())print(mo.group(1))

运行结果:

innovative

novative

我们的正则表达式 in(novative|flight) 只指定了一次前缀 in,所以很方便。可惜,这种方法在中文中不适用,因为中文必须先分词哦๑乛◡乛๑

注意: 如果需要匹配真正的管道字符 |, 那么就必须使用倒斜杠进行转义,即\|

2 可选匹配

2.1 匹配零次或一次(问号字符 ?

phone_num_regex = re.compile(r'(\(\d\d\d\d\)-)?\d\d\d\d\d\d\d\d')mo = phone_num_regex.search('我的联系号码为: (0591)-83822032.')print(mo.group())mo = phone_num_regex.search('我的联系号码为: 83822032.')print(mo.group())

运行结果:

(0591)-83822032

83822032

模式 \(\d\d\d\d\)- 是可选的分组,即希望找出的号码,可带(出现一次)或者可不带区号(出现零次)。

2.2 匹配零次或多次(星号字符 *

星号字符 * 表示可匹配零次或多次,即星号之前的分组,可以在文本中不出现或者出现任意次。

phone_num_regex = re.compile(r'(\(\d\d\d\d\)-)*\d\d\d\d\d\d\d\d')mo = phone_num_regex.search('我的联系号码为: (0591)-(0592)-83822032.')print(mo.group())

运行结果:

(0591)-(0592)-83822032

2.3 匹配一次或多次(加号字符 +

+(加号) 表示“ 匹配一次或多次”,也就是说,它前面的分组必须“ 至少出现一次”。

phone_num_regex = re.compile(r'(\(\d\d\d\d\)-)+\d\d\d\d\d\d\d\d')mo = phone_num_regex.search('我的联系号码为: (0591)-83822032.')print(mo.group())mo = phone_num_regex.search('我的联系号码为: 83822032.')print(mo==None)

运行结果:

(0591)-83822032

True

可以看到,如果 search() 方法没有找到匹配的文本,那么返回的 Match 对象为 None。

2.4 匹配特定次数(花括号)

如果想要一个分组重复特定次数,那么可以在正则表达式中,在该分组的后面跟上花括号所包围的次数。比如 (号码){3} 会匹配字符串 “号码号码号码”。

花括号除了使用一个次数数字,还可以指定一个范围,即在花括号中定义一个最小值、一个逗号和一个最大值。例如,正则表达式(号码){1,3}将匹配 ‘号码’、 ‘号码号码’ 和 ‘号码号码号码’。

name_regex = re.compile(r'(地球){2}')mo = name_regex.search('英媒称,过不了多久,人们也许可以搭乘火箭,看见整个地球地球。')print(mo.group())mo = name_regex.search('英媒称,过不了多久,人们也许可以搭乘火箭,看见整个地球。')print(mo==None)

运行结果:

地球地球

True

这里, (地球){2}匹配’地球地球’, 但不匹配’地球’。因为它不匹配只包含一个 ‘地球’ 的文本,所以第二次调用 search() 会返回 None。

转载地址:https://deniro.blog.csdn.net/article/details/103447269 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:说说 Python 的贪心和非贪心匹配策略
下一篇:说说如何在 Python 的正则表达式中使用分组

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月14日 10时13分16秒