0

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

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

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

似乎正在发生的事情是\1并且\3不会被添加到输出中。

我也用替换表达式试过这个:

r'\1%s\3'%orderid

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

4

2 回答 2

1

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

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'
于 2013-10-08T20:57:52.140 回答
0

这是行不通的:

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

r前缀仅影响文字的解释方式。因此,r'%s'意味着%ands将被原始解释——但这与没有r. 同时,pattern具有非原始文字"\1"and "\3",因此在您到达%.

你想要的是:

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

但是,您根本不需要%格式化;只需使用pattern它自己,你就会得到完全相同的东西。

于 2013-10-08T20:59:21.083 回答