python正则表达式使用变量代表表达式
问题描述:
我想要实现的是用变量(变量的内容)用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
但我得到了类似的结果。 任何可能解决此问题的建议?
答
您需要使用原始字符串或双倍的反斜杠:
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'
答
这是行不通的:
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
本身就可以得到完全相同的结果。
为什么你甚至需要将这些匹配存储在'\ 1'和'\ 3'中?它们始终是相同的值,只是把它们作为字符串。 're.sub(r'(; 11 =)(\ w +)(;)',“; 11 =”+ id +“;”,line)',或者完全移除捕获:'re.sub(r' ; 11 = \ w +;',“; 11 =”+ id +“;”,line)'(并且您似乎并没有使用'\ w +')。 – Jerry
我尝试了其他的,但这是最终对我的工作。谢谢杰里。我不相信我没有看到。 – Pradyot