我有一个键,值对的python字典,我想用相应的值替换字符串中的一些单词,这些单词是字典中的键。
我尝试了一些可以在网上找到的代码,以下是示例:
test_dict = {'a/a': 'result1', "a/a b/b c/c": "result2"}
sentence = "<<a/a>> something <<a/a b/b c/c>> something"
result = multiple_replace(test_dict, sentence)
def multiple_replace(dict, text):
regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
我期望结果是 <<result1>> something <<result2>> something
实际输出为 <<result1>> something <<result1 b/b c/c>> something
您的问题是您的第一个重定位键'a/a'
是另一个键的一部分'a/a b/b c/c'
。长键不再替换,因为用于规则的规则'a/a'
更改了文本,因此'a/a b/b c/c'
不再能找到它。
如果按减小长度的顺序对键进行排序,则可以避免这种情况,因此先替换较长的键:
import re
def multiple_replace(d, text):
# sort keys by -len so longer ones come first (you could use reverse=True as well)
regex = re.compile("(%s)" % "|".join(map(re.escape,
sorted(d.keys(),key=lambda x:-len(x)))))
return regex.sub(lambda mo: d[mo.string[mo.start():mo.end()]], text)
test_dict = {'a/a': 'result1', "a/a b/b c/c": "result2"}
sentence = "<<a/a>> something <<a/a b/b c/c>> something"
result = multiple_replace(test_dict, sentence)
print(result)
输出:
<<result1>> something <<result2>> something
如果替换的值包含较短键的一部分,您仍然会遇到问题,它将再次被部分替换。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句