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

时间:2018-03-28 07:04:25

标签: python regex

我相信re.sub()正在取代Full Match,但在这种情况下我只想替换匹配的组并忽略非捕获组。我怎么能这样做呢?

string = 'aBCDeFGH'

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

输出是:

+

预期输出为:

+BCD+FGH

1 个答案:

答案 0 :(得分:5)

此类问题的一般解决方案是在替换中使用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))

但是,正如bro-grammer所评论的那样,在这种情况下你可以使用反向引用:

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