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
我想用一系列字符替换点 ('.'
),例如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