python regex使用变量替换表达式

时间:2013-10-08 20:53:38

标签: python regex

我想要实现的是使用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

但我得到了类似的结果。 关于什么可能解决这个问题的任何建议?

2 个答案:

答案 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本身就可以得到完全相同的东西。