次の行があります。
b = re.sub('^xMain (\S+)/y1,/y0 (\S+ )(.*)$', 'xMain \2\1\3', a)
a は次のとおりです。
xMain Buchan/y1,/y0 Angus Sub1
なぜb
として出てくるの'xMain \x02\x01\x03'
ですか?私の意図は、名前を逆にすることです。Regexbuddy では問題なく動作しますが、Python 2.7 では動作しません。
次の行があります。
b = re.sub('^xMain (\S+)/y1,/y0 (\S+ )(.*)$', 'xMain \2\1\3', a)
a は次のとおりです。
xMain Buchan/y1,/y0 Angus Sub1
なぜb
として出てくるの'xMain \x02\x01\x03'
ですか?私の意図は、名前を逆にすることです。Regexbuddy では問題なく動作しますが、Python 2.7 では動作しません。
8 進数のエスケープ コードとして、通常\2\1\3
の python 文字列でも意味があるため、印刷できない文字が表示されます。
>>> '\2'
'\x02'
>>> 'xMain \2\1\3'
'xMain \x02\x01\x03'
re.sub()
書かれているように関数に到達することはありません。
代わりに生の文字列リテラルを使用します。
b = re.sub('^xMain (\S+)/y1,/y0 (\S+ )(.*)$', r'xMain \2\1\3', a)
文字列に注意してくださいr'...'
。生の文字列リテラル\...
では、エスケープ コードは解釈されず、re
モジュールが使用できるように後方参照を残します。
>>> r'xMain \2\1\3'
'xMain \\2\\1\\3'
別の方法は、エスケープをエスケープして、バックスラッシュを 2 つにすることです。
b = re.sub('^xMain (\S+)/y1,/y0 (\S+ )(.*)$', 'xMain \\2\\1\\3', a)
いずれにせよ、置換パターンが期待どおりに機能するようになりました。
>>> import re
>>> a = 'xMain Buchan/y1,/y0 Angus Sub1'
>>> re.sub('^xMain (\S+)/y1,/y0 (\S+ )(.*)$', r'xMain \2\1\3', a)
'xMain Angus BuchanSub1'