本文共 2313 字,大约阅读时间需要 7 分钟。
如果希望匹配多个表达式中的一个时, 可以使用管道匹配字符 |
。
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() 方法,找出“所有”匹配的文本。
组合使用管道与括号,可以实现匹配多个模式。
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,所以很方便。可惜,这种方法在中文中不适用,因为中文必须先分词哦๑乛◡乛๑
注意: 如果需要匹配真正的管道字符 |
, 那么就必须使用倒斜杠进行转义,即\|
。
?
)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\)-
是可选的分组,即希望找出的号码,可带(出现一次)或者可不带区号(出现零次)。
*
)星号字符 *
表示可匹配零次或多次,即星号之前的分组,可以在文本中不出现或者出现任意次。
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
+
)+(加号) 表示“ 匹配一次或多次”,也就是说,它前面的分组必须“ 至少出现一次”。
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。
如果想要一个分组重复特定次数,那么可以在正则表达式中,在该分组的后面跟上花括号所包围的次数。比如 (号码){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。
转载地址:http://frbcf.baihongyu.com/