我有以下一行:
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中没有。
答案 0 :(得分:2)
您会看到不可打印的字符,因为\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'
另一种方法是将反斜杠加倍,逃避逃脱:
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'