14-贪心和非贪心匹配
7.4 贪心和非贪心匹配
在字符串 'HaHaHaHaHa'
中, (Ha){3,5}
可以匹配3个、4个或5个实例,但若用 (Ha){3,5}
去查找 'HaHaHaHaHa'
时,你会发现 Match
对象的 group()
调用只会返回 'HaHaHaHaHa'
,而不是更短的可能结果。毕竟 'HaHaHa'
和 'HaHaHaHa'
也能够有效地匹配正则表达式 (Ha){3,5}
。
Python的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”(也称为“惰性”)版本尽可能匹配最短的字符串,即在结束的花括号后跟着一个问号。
在交互式环境中输入以下代码,在查找相同字符串时,注意花括号的贪心形式和非贪心形式之间的区别:
>>> greedyHaRegex = re.compile(r'(Ha){3,5}')
>>> mo1 = greedyHaRegex.search('HaHaHaHaHa')
>>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?')
>>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa')
>>> mo2.group()
'HaHaHa'
请注意,问号在正则表达式中可能有两种含义:声明非贪心匹配或表示可选的分组。这两种含义是完全无关的。