Python,替换所有出现的地方

Python, substitute all occurrences

我有一个 python 脚本,我正在使用 re.sub 来替换变量。 如果变量只出现一次,一切都很好,但是当它出现两次或更多次时,它会给我错误。 任何想法 ?我是 reg 表达式的新手。 :/

我的代码:

    plot = re.sub(r'_choice1_','%s',plot)%data1
    plot = re.sub(r'_choice2_','%s',plot)%data2

只是不要在这里使用正则表达式,当 Python 具有完美的功能 str.replace 时完全没有必要。当您需要使用模式匹配时使用正则表达式 - 而不是用于直接字符串替换。

plot = plot.replace('_choice1_', data1)
plot = plot.replace('_choice2_', data2)

无论如何,错误在这里:

plot = re.sub(r'_choice1_','%s',plot)%data1
                                     ^^^^^^

您将 _choice1_ 替换为 %s,因为您的字符串格式位于替换的 结尾 ,如果您替换了超过一个,然后应用字符串格式将失败,因为您只传递了一个 data1 值...例如:如果结果字符串中有两个 %s,则 % 将失败因为它没有足够的参数来填充格式字符串的其余部分。

如果您真的非常非常想使用 re.sub,那么请使用:

plot = re.sub(r'_choice1_', data1 ,plot)

如果您真的非常非常想以有意义的方式使用正则表达式,那么使用可调用对象作为替代,例如:

import re

data = ['egg', 'spam']
text = 'I would like some _choice1_ with my _choice2_ please'
new_text = re.sub('_choice(\d+)_', lambda m: data[int(m.group(1)) - 1], text)
# I would like some egg with my spam please

所以在你的情况下 - 那将是 data = (data1, data2),并且正则表达式引擎将从选择的末尾提取数字,将其转换为 int,然后索引到你的数组中 return 要子的字符串。因此,如果您有多个或更高级的用途,那么它比 运行 很多多个替换要好,因为正则表达式引擎可以一次完成。但是,对于两个值,我会坚持 str.replace.

正如乔恩所说,您应该使用字符串替换。否则,您正在使用正则表达式替换,就好像它是某种传统的字符串格式一样。您需要改为执行以下操作:

plot = re.sub(r'_choice1_', data1, plot)
plot = re.sub(r'_choice2_', data2, plot)

如果你想使用完全多余的字符串格式,你需要在格式说明符之后直接使用元组进行格式化,如下所示:

plot = re.sub(r'_choice1_', '%s' % (data1,), plot)
plot = re.sub(r'_choice2_', '%s' % (data2,), plot)