有人可以解释为什么以下返回'cc'?
>>> re.match('(..)+', 'aabbcc').group(1)
'cc'
我被告知因为它将每场比赛放入组(1),所以最后一场比赛是'cc'。这是真的吗?
然后如何解释以下?
>>> re.match('(..)+(...)', 'aabbcc').group(1)
'aa'
答案 0 :(得分:5)
(..)
定义的组是第1组。+
量词重复它。每次引擎能够重复该组(匹配两个字符)时,组1都会被覆盖。
aa
捕获到第1组bb
捕获到第1组cc
捕获到第1组。检查第1组时,引擎返回cc
。所有其他捕获都丢失了。
(.NET引擎除外,它还返回cc
,但也允许您通过CaptureCollection对象检查中间捕获。它将包含aa
,bb
和{ {1}}。)
cc
,为什么第1组包含(..)+(...)
?回溯!
要理解这一点,我们再次需要遵循正则表达式引擎的路径。
aa
捕获到第1组aa
组并将(..)
捕获到第1组bb
组并将(..)
捕获到第1组cc
。它失败了:没有任何字符可供使用。(...)
表示一次或多次,我们匹配+
三次,因此我们可以给一个,甚至两个。在此阶段,引擎会放弃量化的..
组的最后一场比赛,即(..)+
。我们回到第1组cc
。bb
。只剩下两个字符:(...)
,因此它再次失败。 cc
组的最后一场比赛,即(..)+
。在此阶段,第1组再次为bb
。aa
。它成功:第2组为(...)
,第1组为bbc
<强>参考强>