在正则表达式中,存在两种匹配模式。
- 贪婪模式:正则表达式,在符合条件前提下,会尽可能多的匹配结果
- 懒惰模式:在正则表达式,如果符合条件的前提下,会尽可能少的匹配。
在Python中正则表达式默认是贪婪模式(个别语言也可能是非贪婪模式),贪婪模式就是总会尝试匹配到更多的字符。非贪婪模式则反之,总是尝试匹配尽可能少的字符。
在*、?、+、{m,n}后面加上?,可以将贪婪模式变成非贪婪模式。
*? | 重复任意次,但尽可能少重复 |
---|---|
+? | 重复一次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
案例
>>>content="<table><tr><td>大家好</td><td>大家好</td><td>大家好</td><td>大家好</td></tr></table>"
>>>re.findall(r"<td>(.*)</td>",content) #贪婪模式
['大家好</td><td>大家好</td><td>大家好</td><td>大家好']
>>>re.findall(r"<td>(.*?)</td>",content) #非贪婪模式
['大家好', '大家好', '大家好', '大家好']