书籍《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中正则表达式默认时贪心的,即尽可能匹配最长的字符串。
想要使正则表达式变成非贪心匹配,让它匹配最短的字符串,只需要在花括号后面加个?即可。
来个例子:
|