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)
我有一个 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)