考虑以下执行。
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'
所以基本上,我试图修改十六进制值,但只修改两个最低有效数字。在这个例子中,我尝试替换' 01'使用' 02',如果存在于输入字符串中。 第一次re.sub()调用的输出是预期的。但是,我完全不理解第二次调用的输出(当然,我想这样做)。这就是困扰我很长一段时间了,我倾向于问这可能是一个python bug?或者我在这里遗漏了什么?
答案 0 :(得分:4)
'0x\\1'+format(new_value, '02x')
是'0x\\102'
,Python将\\102
视为单个转义序列。因为正好有三个八进制数字,所以它被视为八进制转义(而不是对组102的引用),八进制102是字符B
。要解决此问题,请写下'0x\\g<1>'+format(new_value, '02x')
。