您需要使用原始字符串或双反斜杠:
pattern = r"\1" + id + r"\3"
或者
pattern = "\\1" + id + r"\\3"
在常规的 Python 字符串文字中,\number
被解释为八进制字符代码:
>>> '\1'
'\x01'
而反斜杠在原始字符串文字中没有特殊含义:
>>> r'\1'
'\\1'
原始字符串文字只是一种表示法,而不是一种类型。两者都r''
产生字符串,只是它们在源代码中''
解释反斜杠的方式不同。
请注意,由于第 1 组和第 3 组匹配文字文本,因此您根本不需要使用替换;只需使用:
out = re.sub(r';11=\w+;', ';11=%s;' % id, line)
或使用后视和前瞻,而不必重复文字:
out = re.sub(r'(?<=;11=)\w+(?=;)', id, line)
演示:
>>> import re
>>> line = 'foobar;11=spam;hameggs'
>>> id = 'monty'
>>> re.sub(r';11=\w+;', ';11=%s;' % id, line)
'foobar;11=monty;hameggs'
>>> re.sub(r'(?<=;11=)\w+(?=;)', id, line)
'foobar;11=monty;hameggs'