Python,替换所有出现的

时间:2015-03-07 22:21:04

标签: python regex substitution

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

我的代码:

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

2 个答案:

答案 0 :(得分:3)

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

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

无论如何,错误就在这里:

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

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

如果您确实非常非常想使用re.sub,请使用:

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

如果你真的,真的,真的想以有意义的方式使用正则表达式,那么使用callable作为替代,例如:

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,然后索引到数组中以将字符串返回到子。因此,如果您有多个或更多高级用途,那么它比运行大量多次替换更好,因为正则表达式引擎可以在一个中完成。但是,对于两个值,我会坚持str.replace

答案 1 :(得分:1)

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

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)