即使使用非捕获组,Python re.sub()也将替换完全匹配项

Dar*_*win 7 python regex

我相信re.sub()会替换完全匹配项,但是在这种情况下,我只想替换匹配的组,而忽略非捕获组。我该怎么办?

string = 'aBCDeFGH'

print(re.sub('(a)?(?:[A-Z]{3})(e)?(?:[A-Z]{3})', '+', string))
Run Code Online (Sandbox Code Playgroud)

输出是:

+
Run Code Online (Sandbox Code Playgroud)

预期输出为:

+BCD+FGH
Run Code Online (Sandbox Code Playgroud)

pts*_*pts 6

解决此类问题的一般方法是在替换中使用lambda:

string = 'aBCDeFGH'

print(re.sub('(a)?([A-Z]{3})(e)?([A-Z]{3})', lambda match: '+%s+%s' % (match.group(2), match.group(4)), string))
Run Code Online (Sandbox Code Playgroud)

但是,正如bro-grammer所说,在这种情况下,您可以使用反向引用:

print(re.sub('(a)?([A-Z]{3})(e)?([A-Z]{3})', r'+\2+\4', string))
Run Code Online (Sandbox Code Playgroud)