【问题标题】:How do I perform multiple string replacement with replacement clashes? [duplicate]如何使用替换冲突执行多个字符串替换? [复制]
【发布时间】: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


【解决方案1】:

假设单个字符发生变化,使用str.translate(对于python 3):

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

【讨论】:

  • 在单个字符的情况下确实非常有用,谢谢:)
猜你喜欢
  • 2021-05-31
  • 2017-05-15
  • 1970-01-01
  • 2019-05-20
  • 2020-08-31
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多