博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
说说 Python 正则表达式的匹配类型
阅读量:1905 次
发布时间:2019-04-26

本文共 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。

转载地址:http://frbcf.baihongyu.com/

你可能感兴趣的文章
4.阿里云上安装nacos
查看>>
6.阿里云上安装kafka
查看>>
5.阿里云上安装zookeeper
查看>>
7.阿里云上安装RabbitMQ
查看>>
JDK8 管道 Stream 详细使用介绍
查看>>
2.启停项目脚本
查看>>
配置了阿里云安全组端口,浏览器还是不能访问的问题
查看>>
mysql出表锁表MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
查看>>
cron表达式基础配置知识
查看>>
lombok基础使用
查看>>
jar启停服务
查看>>
1.docker基础概念
查看>>
2.docker安装
查看>>
1.jdk8中Stream基础操作
查看>>
1.arthas基础
查看>>
nginx 安装
查看>>
1.nginx常用命令
查看>>
2.nginx.conf配置文件
查看>>
1.linux grep文件查询小结
查看>>
kafka 集成springboot
查看>>