我想要实现的是使用python regex用变量(变量的内容)替换字符串。由于我需要保留一些匹配的表达式,因此我使用\1
和\3
组匹配args。
我的正则表达式/ sub看起来像这样:
pattern = "\1" + id + "\3" \b
out = re.sub(r'(;11=)(\w+)(;)',r'%s' % pattern, line)
似乎正在发生的事情是\1
并且\3
没有添加到输出中。
我还尝试使用替换表达式:
r'\1%s\3'%orderid
但我得到了类似的结果。 关于什么可能解决这个问题的任何建议?
答案 0 :(得分:1)
您需要使用原始字符串或加倍反斜杠:
pattern = r"\1" + id + r"\3"
或
pattern = "\\1" + id + r"\\3"
在常规Python字符串文字中,\number
被解释为八进制字符代码:
>>> '\1'
'\x01'
虽然反斜杠在原始字符串文字中没有特殊含义:
>>> r'\1'
'\\1'
原始字符串文字只是符号,而不是类型。 r''
和''
都会生成字符串,只会在解释源代码中的反斜杠方面有所不同。
请注意,由于第1组和第3组匹配 literal 文本,因此您根本不需要使用替换;只需使用:
out = re.sub(r';11=\w+;', ';11=%s;' % id, line)
或使用look-behind和lookahead并放弃重复文字:
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'
答案 1 :(得分:0)
这不起作用:
pattern = "\1" + id + "\3"
# ...
r'%s' % pattern
r
前缀仅影响文字的解释方式。因此,r'%s'
表示%
和s
将被解释为原始 - 但这与他们在没有r
的情况下被解释的方式相同。同时,pattern
具有非原始文字"\1"
和"\3"
,因此在您到达%
之前,它已经是控件-A和控件-C。 / p>
你想要的是:
pattern = r"\1" + id + r"\3"
# ...
'%s' % pattern
但是,您根本不需要%
格式;只需使用pattern
本身就可以得到完全相同的东西。