re.sub() 在指定组名时表现异常

re.sub() behaves weirdly when group name is specified

我想用一系列字符替换点 ('.'),例如foo.bar > fooDOTbar,但前提是点不在两个数字之间,例如0.9 > 0.9。所以我做了:

regex = re.compile(r'([a-zA-Z])(?P<dot>\.)([a-zA-Z])')
input_str = 'foo.bar'
output = regex.sub(r'DOT\g<dot>', input_str)

print(output)
'foDOT.ar'

这完全出乎我的意料。我尝试用 .search() 替换 .sub() 它似乎工作得很好 (match.group('dot') returns '.').

为什么您需要为您知道要扔掉的东西命名捕获?我说的是 (?P<dot>\.)。您可以这样做:

>>> regex = re.compile(r'(?P<before>[a-zA-Z])(\.)(?P<after>[a-zA-Z])')
>>> regex.sub(r'\g<before>DOT\g<after>', input)
'fooDOTbar'

或不使用群组:

import re
regex = re.compile(r'(?<=[a-zA-Z])(\.)(?=[a-zA-Z])')
input_str = 'foo.bar'
output = regex.sub(r'DOT', input_str)

print(output)

输出:

fooDOTbar