贪心和非贪心匹配
Python正则表达式默认是贪心的,在有二异的情况下,他们会尽可能的匹配最长的字符串。
所以当我们使用(Ha){3,5}匹配'HaHaHaHaHa'的时候回匹配到'HaHaHaHaHa'。
而{}?既是非贪心版本,它会尽可能的匹配最短的字符串。
例如:
import re greedyHaRegex = re.compile(r'(Ha){3,5}') mo = greedyHaRegex.search('HaHaHaHaHa') print(mo.group()) greedyHaRegex = re.compile(r'(Ha){3,5}?')#非贪心匹配 mo1 = greedyHaRegex.search('HaHaHaHaHa') print(mo1.group())
运行结果:
HaHaHaHaHa
HaHaHa
>>>
注意:?问号在正则表达式中可能有两种意思:声明非贪心匹配或者表示可选分组,这两种含义完全无关。
二 findall()方法
除了search()方法外,Regex对象也有一个findall()方法。
search()返回一个Match对象,包含被查找字符串中的‘第一次’匹配文本。
findall()方法将返回一组字符串,包含被查找文本中所有匹配。
例子:
>>> phoneNum = re.compile(r'ddd-ddd-dddd') >>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821') ['400-820-8820', '400-820-8821']
findall()返回的不是一个Match对象,而是返回一个字符串列表,只要在正则表达式中没有分组。
如果在正则表达式中进行了分组,那么findall()将返回元组的列表。每个元组表示一个找到的匹配,其中的项就是正则表达式中每个分组的匹配字符串。
例如:(请注意,被编译的正则表达式有分组)
>>> phoneNum = re.compile(r'(ddd)-(ddd)-(dddd)') >>> phoneNum.findall('Cell:400-820-8820 Work:400-820-8821') [('400', '820', '8820'), ('400', '820', '8821')]
记住分组和不分组的区别。