1

次の行があります。

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 では動作しません。

4

1 に答える 1

2

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'
于 2013-11-12T15:12:17.217 に答える