使用python 2.7 regex替换部分字符串

时间:2013-11-12 15:10:06

标签: python regex 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中没有。

1 个答案:

答案 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'