eal*_*nso 9 python regex capture optional
import re
str='abc defg'
m1 = re.match(".*(def)?",str)
m2 = re.match(".*(def)",str)
print (m1.group(1),m2.group(1))
Run Code Online (Sandbox Code Playgroud)
以上的输出是:
(没有,'def')
到底是怎么回事?即使使用非贪婪的重复运算符,(def)?也不会匹配可选的捕获组.
Ilm*_*nen 13
下面是当正则表达式引擎尝试匹配会发生什么.*(def)反对abc defg:
.*最初尝试匹配尽可能多的次数,匹配整个字符串.(def),这.*仅在匹配时发生abc .但是,如果我们将正则表达式更改为,则会.*(def)?发生以下情况:
.*尽可能多的匹配整个字符串.(def)?是贪婪的,如果可能,引擎会更喜欢匹配它,但它不会回溯早期的子模式只是为了看它是否可以.相反,它只是让.*吞噬整个字符串,没有留下任何东西(def)?.类似的事情发生在.*?(def)和.*?(def)?:
.*?尝试尽可能少地匹配,即根本不匹配.(def)无法比拟,但(def)?可以.因此,对于(def)正则表达式引擎必须返回并考虑更长的匹配,.*?直到它找到一个允许完整模式匹配,而因为(def)?它不必这样做,所以它不会.有关更多信息,请参阅Perl正则表达式手册的"组合RE部分"部分(与Python的"Perl兼容"正则表达式的行为相匹配).