【问题标题】:Avoid string replace repetition [duplicate]避免字符串替换重复[重复]
【发布时间】:2016-03-10 01:44:09
【问题描述】:

这个问题我一直在思考。 我有一些字符串转换工作的替换规则。我正在学习正则表达式并慢慢找到正确的模式,这没问题。但是,其中有很多规则,我无法在一个表达式中完成它们。现在这些过程是重叠的。让我举个简单的例子。

想象一下,我想用'o' 替换字符串中的每个'a'。 我还想将同一字符串中的每个'o' 替换为'k',但是没有顺序,所以如果我先应用前面的规则,那么现在转换后的'a's 将变为'k',这很简单不是我的本意。因为所有转换必须具有相同的优先级或优先级。我该如何克服这个问题?

我使用re.sub(),但我认为string.replace() 方法存在同样的问题。 感谢所有帮助,谢谢!

【问题讨论】:

标签: python regex string python-2.7 python-3.x


【解决方案1】:

不要使用str.replace(),使用str.translate()

这是使用 Python 2 的方法:

from string import maketrans

s = 'aoaoaoaoa'
trans_table = maketrans('ao', 'ok')
print s.translate(trans_table)

输出

奥科科科科

Python 3 有点不同:

s = 'aoaoaoaoa'
trans_table = {ord(k):v for k,v in zip('ao', 'ok')}
print(s.translate(trans_table))

【讨论】:

  • 谢谢,但我需要正则表达式,因为我处理的规则非常复杂。这个例子只是为了表达问题。
  • 好的,你能发一个有代表性的例子吗?您只是替换字符还是子字符串?如果多个模式匹配,您将如何决定应用哪个替换?
  • 就我而言,不止一种模式匹配。例如,您可以说我对单词开头或结尾的“a”或单个“a”有不同的替换规则。其他一些字母也是如此。这就是为什么我需要正则表达式而不是 string.replace
【解决方案2】:

我遇到过类似的挑战,最后用占位符替换了第一个字符。然后我替换了第二个字符。第三遍是用所需的字符替换占位符。不花哨,但每次都工作。

将“a”替换为“$”,将“o”替换为“k”,将“$”替换为“o”。

【讨论】:

    【解决方案3】:

    我们可以通过以下代码解决:

    a --> ao; o --> k (a --> ao --> ak); ak --> o

    string_test =  "aaaoakkokkooao"
    print (string_test.replace("a", "ao").replace("o", "k").replace("ak", "o"))
    

    【讨论】:

      【解决方案4】:

      试试这个(适用于 python2 和 python3)

      RULES = { 'a': 'o', 'o':'k'}  # a->o, o->k, ... no precedence
      source = 'Hello I am ok'
      dest = "".join(RULES.get(c,c) for c in source)
      print (dest)
      

      您可以轻松添加规则。

      如果有“循环”,它也可以工作(例如,添加 'k':'a' 将使循环 a -> o -> k -> a )。

      最大的问题是它不使用正则表达式(正如您的 OP 要求的那样)。如果您的正则表达式完全针对一个字符,并且都是互斥的,则可以。如果是这种情况,那么您将不需要正则表达式(我上面的解决方案就足够了)。如果两个正则表达式匹配(不同的长度),你会怎么做?您使用哪一个(因为您不想要任何优先级)?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-04
        • 2011-07-01
        • 1970-01-01
        • 2014-02-05
        • 2012-07-23
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多