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'

したがって、基本的に、16 進数値を変更しようとしていますが、最下位 2 桁のみです。この例では、入力文字列に存在する場合、「01」を「02」に置き換えようとしています。最初の re.sub() 呼び出しの出力が期待されます。ただし、2番目の呼び出しの出力を完全に理解できません(もちろん、やりたいことです)。これは長い間私を困惑させているものであり、私はそれがPythonのバグである可能性があると尋ねる傾向があります. または、ここで何か不足していますか?

4

1 に答える 1

4

'0x\\1'+format(new_value, '02x')is'0x\\102'であり、Python は\\102を単一のエスケープ シーケンスとして扱います。正確に 3 桁の 8 進数があるため、これは (グループ 102 への参照ではなく) 8 進数のエスケープとして扱われ、8 進数の 102 は文字B. これを修正するには、次のように記述し'0x\\g<1>'+format(new_value, '02x')ます。

于 2015-03-03T17:53:01.023 に答える