6

当我使用 re.sub 将字符串中的两个单词更改为其他两个单词时,我得到了输出。但是当我尝试用数字输出不正确时

>>> import re
>>> a='this is the string i want to change'
>>> re.sub('(.*)is(.*)want(.*)','\\1%s\\2%s\\3' %('was','wanted'),a)
'this was the string i wanted to change'
>>> re.sub('(.*)is(.*)want(.*)','\\1%s\\2%s\\3' %('was','12345'),a)
'this was\x8a345 to change'
>>>

我不知道为什么会这样

4

1 回答 1

8

发生的情况是您传入了 replacement r'\1was\212345\3',而 Python 无法确定您是否需要反向引用编号 2, 21, 211, ... 。它只选择最大的 212345,这显然不是您表达式中的组索引。因此,Python 决定您的意思是 bytestring 文字b'\212',这是一种奇怪的b'\x8a'.

要解决歧义,请使用长反向引用语法\g<GROUP_NUMBER_HERE>

>>> re.sub('(.*)is(.*)want(.*)','\\g<1>%s\\g<2>%s\\g<3>' %('was','12345'),a)
'this was the string i 12345 to change'
于 2012-08-14T09:36:51.200 回答