说说 Python 正则表达式的匹配类型

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。

发布了601 篇原创文章 · 获赞 668 · 访问量 88万+

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/103447269