我有以下行:
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 中则不行。
最佳答案
您会看到无法打印的字符,因为 \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'
关于python - 使用 python 2.7 正则表达式替换字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19932759/