解释这个问题的行为

时间:2014-12-23 06:38:24

标签: python regex python-2.7

我有以下内容:

>>> re.sub('(..)+?/story','\\g<1>','money/story')
'mey'
>>>

为什么捕获组1是money的第一个字母和最后两个字母而不是前两个字母?

2 个答案:

答案 0 :(得分:1)

因为字符串money包含5个字母(奇数)不均匀,所以它甚至不会匹配第一个字母m(..)+?捕获两个字符,并且非贪婪地重复该模式一次或多次。因为重复量化器+存在于捕获组旁边,所以它将捕获匹配的最后两个字符。现在,捕获的组包含此(..)+?模式完成的匹配的最后两个字符。所以你得到ey作为捕获的字符串而不是第一个on。因此,通过将所有匹配的字符替换为组索引1 ey内的字符串,将为您提供mey

DEMO

答案 1 :(得分:1)

第一个捕获组根本不包含m(..)+?/story匹配的内容是oney/story

(..)+?匹配偶数个字符,因此匹配以下内容(间隔以使其更清晰):

m o n e y / s t o r y
  ^-^ ^-^

然后替换是第一个捕获组。您可能不知道的是,当您有重复捕获组(在本例中为(..)+?)时,只保留最后捕获的组。

总结一下,oney/story已匹配,并替换为ey,因此结果为mey