如何在python中编写多个替换?

Kaung Myat Paing

我有一个键,值对的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章