我有以下内容:
>>> re.sub('(..)+?/story','\\g<1>','money/story')
'mey'
>>>
为什么捕获组1是money
的第一个字母和最后两个字母而不是前两个字母?
答案 0 :(得分:1)
因为字符串money
包含5个字母(奇数)不均匀,所以它甚至不会匹配第一个字母m
。 (..)+?
捕获两个字符,并且非贪婪地重复该模式一次或多次。因为重复量化器+
存在于捕获组旁边,所以它将捕获匹配的最后两个字符。现在,捕获的组包含此(..)+?
模式完成的匹配的最后两个字符。所以你得到ey
作为捕获的字符串而不是第一个on
。因此,通过将所有匹配的字符替换为组索引1 ey
内的字符串,将为您提供mey
。
答案 1 :(得分:1)
第一个捕获组根本不包含m
。 (..)+?/story
匹配的内容是oney/story
。
(..)+?
匹配偶数个字符,因此匹配以下内容(间隔以使其更清晰):
m o n e y / s t o r y
^-^ ^-^
然后替换是第一个捕获组。您可能不知道的是,当您有重复捕获组(在本例中为(..)+?
)时,只保留最后捕获的组。
总结一下,oney/story
已匹配,并替换为ey
,因此结果为mey
。