【发布时间】:2019-11-27 16:03:26
【问题描述】:
我有一个字符串替换列表。每个替换都是微不足道的(常量表达式),但列表可能包含替换冲突,如下所示:
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)?
还是我需要自己观看冲突?
注意:我知道在preconditions 重叠的情况下,上述逻辑包含未解决的问题。 reps 实际上是有序的(因为 python 3.8)或者可以被视为[('a', 'b'), ('b', 'c'), ('c', 'a')] 以优先替换并解决歧义。
补充说明:
我也知道this solution 涉及使用像"%temp%" 这样的临时缓冲区是传统的方法。然而:
- 这个技巧的普通实现对于碰巧已经包含
"%temp%"的攻击字符串并不健壮。 - 这个技巧的普通实现意味着为
reps中的每个基本替换执行一到两次替换传递,如果替换很多或字符串很长,这很可悲。
因此,这种传统的技巧是不够的,需要更加小心地解决问题。
我想知道的是python是否提供标准、快速和健壮的解决方案来解决这个问题。
【问题讨论】:
-
@Chris_Rands 确实可能重复。这是否意味着我必须自己解决冲突,或者 python 是否提供了自动化
%temp%技巧的功能? (ie.检查%temp%本身不会触发更多冲突,等等。)
标签: python python-3.x string replace