如何使用替换冲突执行多字符串替换?

时间:2019-11-27 16:03:26

标签: python python-3.x string replace

我有一个字符串替换列表。每次替换都是琐碎的(常量表达式),但是列表中可能包含替换冲突,如下所示:

reps = {
    'a': 'b',
    'b': 'c',
    'c': 'a',
}

所以我希望字符串grab my cat变成grbc my abt

但是,如果我进行过幼稚的连续替换,例如

,我将不会成功。
for pre, post in reps.items():
    string.replace(pre, post)

,因为发生冲突。例如,在这里我将得到graa my aat

在python中是否有一种标准的方法来执行此操作,同时避免了处理冲突的样板?像string.multiple_replace(reps)一样?
还是我需要自己观看冲突?


注意:我知道,在pre条件重叠的情况下,上述逻辑包含未解决的问题。 reps实际上是有序的(自python 3.8起),或者可以视为[('a', 'b'), ('b', 'c'), ('c', 'a')]来优先考虑替换并解决歧义。


更多说明: 我还知道,this solution涉及使用"%temp%"之类的临时缓冲区是传统的处理方式。但是:

  • 此技巧的有效实现无法可靠地应对已经包含"%temp%"的攻击字符串。
  • 该技巧的有效实现意味着对reps中的每个基本替换执行一次或两次替换操作,如果替换次数很多或字符串很长,这将是令人遗憾的。

因此,这种传统技巧还不够,需要更加谨慎地解决问题。

我想知道的是python是否提供标准,快速和强大的解决方案。

1 个答案:

答案 0 :(得分:2)

假设单个字符更改,请使用str.translate(对于python 3):

>>> str.translate('grab my cat', str.maketrans(reps))
'grbc my abt'