2013-10-08 86 views
0

我想要实现的是用变量(变量的内容)用python正则表达式替换字符串。由于我需要保留一些匹配的表达式,因此我使用\1\3组匹配参数。python正则表达式使用变量代表表达式

我的正则表达式/子看起来是这样的:

pattern = "\1" + id + "\3" \b 
out = re.sub(r'(;11=)(\w+)(;)',r'%s' % pattern, line) 

这似乎是发生的是\1\3没有得到添加到输出。

我也用替换表达式尝试这样做:

r'\1%s\3'%orderid 

但我得到了类似的结果。 任何可能解决此问题的建议?

+1

为什么你甚至需要将这些匹配存储在'\ 1'和'\ 3'中?它们始终是相同的值,只是把它们作为字符串。 're.sub(r'(; 11 =)(\ w +)(;)',“; 11 =”+ id +“;”,line)',或者完全移除捕获:'re.sub(r' ; 11 = \ w +;',“; 11 =”+ id +“;”,line)'(并且您似乎并没有使用'\ w +')。 – Jerry

+0

我尝试了其他的,但这是最终对我的工作。谢谢杰里。我不相信我没有看到。 – Pradyot

回答

1

您需要使用原始字符串或双倍的反斜杠:

pattern = r"\1" + id + r"\3" 

pattern = "\\1" + id + r"\\3" 

在常规的Python字符串文字,\number被解释为一个八进制字符代码,而不是:

>>> '\1' 
'\x01' 

虽然反斜杠没有特别的意义n中的原始字符串字面:

>>> 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' 
0

这是行不通的:

pattern = "\1" + id + "\3" 
# ... 
r'%s' % pattern 

r前缀仅影响文字的解释方式。因此,r'%s'表示%s将被解释为原始 - 但这与在没有r的情况下解释它们的方式相同。同时,pattern有非原始文字"\1""\3",所以它已经是一个控制-A和一个控制-C,然后你甚至可以进入%

你想要的是:

pattern = r"\1" + id + r"\3" 
# ... 
'%s' % pattern 

不过,你真的不需要%格式在所有;只需使用pattern本身就可以得到完全相同的结果。