1

考虑以下执行。

Python 2.7.2 (default, Sep 19 2012, 01:44:39)
[GCC 4.2.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> old_value=1
>>> new_value=2
>>> re.sub('0x(..)'+format(old_value, '02x'), '0x\\1x'+format(new_value, '02x'), '0xab01')
'0xabx02'
>>> re.sub('0x(..)'+format(old_value, '02x'), '0x\\1'+format(new_value, '02x'), '0xab01')
'0xB'

所以基本上,我试图修改一个十六进制值,但只有两个最低有效数字。在此示例中,如果输入字符串中存在“02”,我尝试将“01”替换为“02”。第一个 re.sub() 调用的输出是预期的。但是,我完全无法理解第二次调用的输出(这当然是我想做的)。这让我困惑了很长时间,我倾向于问这可能是一个 python 错误吗?或者我在这里遗漏了什么?

4

1 回答 1

4

'0x\\1'+format(new_value, '02x')is '0x\\102',并且 Python 将\\102视为单个转义序列。因为恰好有三个八进制数字,所以它被视为八进制转义(而不是对组 102 的引用),并且八进制 102 是字符B。要解决此问题,请编写'0x\\g<1>'+format(new_value, '02x').

于 2015-03-03T17:53:01.023 回答