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

您会看到不可打印的字符,因为在常规python 字符串中也\2\1\3有意义,例如八进制转义码:

>>> '\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'

另一种方法是将反斜杠加倍,以逃避转义:

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 回答