Python如何按顺序替换指定关键词且每个关键词仅替换首次出现实例
字符串指定替换需求实现
需求说明
我知道在句子中替换字符串有多种实现方式,原有示例代码如下:
sentences= 'This is a sentence, even there may be a lot of sentence coming' word_list = ["sentence", 'be', 'coming'] to_replace = ["changes"] res = ' '.join([to_replace if idx in word_list else idx for idx in sentences.split()]) print("After replace: " + str(res)) # 输出 'This is a changes, even there may changes a lot of sentence changes'
我实际的需求是按word_list的顺序,仅替换对应关键词的首次出现,即使句子中存在重复关键词也不全量替换,比如示例中的sentence重复出现两次,仅替换第一次出现的实例即可。需求对应的参数如下:
sentence = 'This is a sentence, even there may be a lot of sentence coming' word_list = ["sentence", 'be', 'coming'] to_replace = ['change1', 'change2', 'change3']
期望输出结果为:
output: 'This is a change1, even there may change2 a lot of sentence change3'
补充问题
我写了如下测试代码,运行后输出了重复的句子,我期望仅得到一个完成所有替换的句子,请问该如何解决?
原有测试代码:
k = [] dummy = 'Lorem what your doing ? how are you guys doing ? dummy me doing bad ' for p1 in x1: for n1, n2 in zip(['Lorem', 'dummy'], ['hello', 'hai']): new = p1.replace(n1, n2) k.append(new) # 输出 ['hello what your doing ? how are you guys doing ? dummy me doing bad ', 'Lorem what your doing ? how are you guys doing ? hai me doing bad ']
解决方案
1. 实现按顺序仅替换关键词首次出现的需求
核心逻辑是利用Python字符串replace方法的第三个参数count,指定count=1即可每次仅替换第一个匹配项,同时要在已经完成替换的字符串基础上继续操作,不要每次都用原始字符串替换。
实现代码:
sentence = 'This is a sentence, even there may be a lot of sentence coming' word_list = ["sentence", 'be', 'coming'] to_replace = ['change1', 'change2', 'change3'] res = sentence # 按顺序配对关键词和替换词,每次仅替换首个匹配项 for old_word, new_word in zip(word_list, to_replace): res = res.replace(old_word, new_word, 1) print("After replace: " + res)
运行后输出和你期望的结果完全一致。
2. 修正测试代码重复输出的问题
原有代码的问题是每次都用原始字符串p1做替换,且每次替换后就往列表里添加一次结果,才会输出两个拆分的句子。正确做法是先初始化结果为原始字符串,依次完成所有替换后,仅添加一次最终结果到列表中即可。
修正后的代码:
k = [] # 此处x1为存储原句子的列表,用你给出的dummy做示例 x1 = ['Lorem what your doing ? how are you guys doing ? dummy me doing bad '] replace_pairs = zip(['Lorem', 'dummy'], ['hello', 'hai']) for p1 in x1: res = p1 for n1, n2 in replace_pairs: # 在上一次替换后的结果基础上继续操作 res = res.replace(n1, n2, 1) k.append(res) print(k)
运行后输出为:['hello what your doing ? how are you guys doing ? hai me doing bad '],符合需求。
内容的提问来源于stack exchange,提问作者Titan
相关产品推荐
相关产品推荐

