我有以下行:
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 中则不行。
您会看到不可打印的字符,因为在常规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'