463|0

552

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

书籍《Python编程快速上手(第2版)》阅读心得3、用正则表达式匹配更多模式 [复制链接]

本帖最后由 xinmeng_wit 于 2024-5-7 21:38 编辑

上一篇中已经通过一个匹配电话号码的例子简单介绍了正则表达式的模式匹配,这一篇中将继续学习使用正则表达式匹配更多的模式。

 

1、利用括号进行分组

假定想要将区号从电话号码中分离。添加括号将在正则表达式中创建分组:(\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用group()方法从一个分组中获取匹配的文本。

来看个例子:

 

上面例子中使用了括号进行了匹配分组,这样在使用group()方法时可以按组来访问,mo.group(1)就是获取第一组的内容,mo.group(2)就是获取第二组的内容。

另外,如果想要获取所有组的内容,而不想通过group(x)的方式来一个一个获取,re还提供了groups()方法,groups()返回多个值的元组,例子如下:

 

 

2、re模块中的转义字符

在正则表达式中以下字符具有特殊的含义:

 

如果要检测包含这些字符的文本模式,就需要用转义字符:

 

例子如下:

 

3、用管道匹配多个分组

正则表达式支持使用管道匹配多个分组,例如re.compile(r'Batman|Tina Fey') 将匹配‘Batman’或者‘Tina Fey’。

如果Batman和Tina Fey都出现在被查找的字符串中,第一次出现的匹配文本将作为Match对象返回。

例子如下:

 

4、用问号实现可选匹配

有时候想要匹配的模式是可选的,不论这段文本在不在,正则表达式都会认为匹配。字符?表明它前面的分组在这个模式中是可选的。

例子如下:

 

 

注意:?表示匹配这个问号之前的分组0次或1次。

5、用星号匹配0次或多次

刚说过了?是匹配0次或1次,但是星号(*)则表示匹配0次或多次,即星号之前的分组可以在文本中出现任意次或者完全不存在。

来看个例子:

 

总结:星号前面的分组不管出不出现都能匹配,不管出现多少次都能匹配。

6、用加号匹配1次或多次

星号表示匹配0次或多次,加号则表示1次或多次,也就是至少出现一次。、

看个例子:

 

通过以上可以看出,如果wo不存在,则无法匹配,调用group()方法就会报错。

 

7、用花括号匹配特定的次数

如果想要一个分组重复匹配特定的次数,就在正则表达式中该分组的后面跟上花括号包围的数字。例如:(Ha){3}将匹配字符串‘HaHaHa’,但是不会匹配‘HaHa’,因为(Ha)只重复了2次。

另外,还可以指定一个范围,例如:(Ha){3,5}将匹配‘HaHaHa’、‘HaHaHaHa’和‘HaHaHaHaHa’。

(Ha){3,}将匹配3次及以上,(Ha){,5}将匹配0~5次。

8、贪心和非贪心匹配

在字符串‘HaHaHaHaHa’中,(Ha){3,5}可以匹配3个、4个或5个,但实际上你会发现调用group()方法时只会匹配‘HaHaHaHaHa’,并不会匹配‘HaHaHa’和‘HaHaHaHa’。

这个就是正则表达式的贪心匹配,在python中正则表达式默认时贪心的,即尽可能匹配最长的字符串。

想要使正则表达式变成非贪心匹配,让它匹配最短的字符串,只需要在花括号后面加个?即可。

来个例子:

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表