Python,替换所有引用

Python,替换所有引用,python,regex,substitution,Python,Regex,Substitution,我有一个python脚本,我正在使用re.sub替换变量。 若变量只发生一次,一切正常,但当它发生两次或更多次时,它会给我错误。 有什么想法吗?我不熟悉reg表达式:/ 我的代码: plot = re.sub(r'_choice1_','%s',plot)%data1 plot = re.sub(r'_choice2_','%s',plot)%data2 这里不要使用正则表达式,当Python有一个功能完善的str.replace时,就完全没有必要了。当您需要处理模式匹配时,请

我有一个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
                                     ^^^^^^
您正在用
%s
替换
\u选项1\u
,因为字符串格式在替换的末尾,如果替换了多个,则应用字符串格式将失败,因为您只传递了一个
数据1
值。。。例如:如果结果字符串中有两个
%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,然后索引到数组中以将字符串返回到sub。因此,如果您有多个或更多高级用途,然后,它比运行大量多个替换要好,因为正则表达式引擎可以在一个替换中完成。然而,对于两个值,我坚持使用
str.replace

只是这里不使用正则表达式,当Python有一个功能完善的
str.replace
时,绝对没有必要。当您需要处理模式匹配时,请使用正则表达式,而不是直接替换字符串

plot = plot.replace('_choice1_', data1)
plot = plot.replace('_choice2_', data2)
无论如何,错误在这里:

plot = re.sub(r'_choice1_','%s',plot)%data1
                                     ^^^^^^
您正在用
%s
替换
\u选项1\u
,因为字符串格式在替换的末尾,如果替换了多个,则应用字符串格式将失败,因为您只传递了一个
数据1
值。。。例如:如果结果字符串中有两个
%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,然后索引到数组中以将字符串返回到sub。因此,如果您有多个或更多高级用途,然后,它比运行大量多个替换要好,因为正则表达式引擎可以在一个替换中完成。但是,对于两个值,我坚持使用
str.replace

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

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)

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

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)

这是什么错误,这是什么错误,这对我帮助很大。我是python新手,但我需要它作为学士学位论文的一部分(但不是主要部分,只有一个脚本)。我不知道有什么简单的方法。再次感谢你;)谢谢,这对我帮助很大。我是python新手,但我需要它作为学士学位论文的一部分(但不是主要部分,只有一个脚本)。我不知道有什么简单的方法。再次感谢你;)非常感谢,这很有帮助……)非常感谢,这很有帮助……)