避免字符串替换重复

时间:2016-03-10 01:44:09

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

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

想象一下,我想用字符串中的'a'替换每个'o'。 我还想在同一个字符串中将每个'o'替换为'k',但是,没有顺序,所以如果我先应用先前的规则,那么转换的'a'现在将成为'k',这根本不是我的意图。因为所有转换必须具有相同的优先级或优先级。我怎样才能克服这个问题?

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

4 个答案:

答案 0 :(得分:1)

请勿使用str.replace(),请使用str.translate()

以下是如何使用Python 2:

from string import maketrans

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

<强>输出

okokokoko

Python 3有点不同:

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

答案 1 :(得分:0)

我遇到了类似的挑战,最后用占位符替换了第一个角色。然后我替换了第二个角色。第三步是用所需的角色替换占位符。不是花哨但每次都有效。

将'a'替换为'$',将'o'替换为'k',将'$'替换为'o'。

答案 2 :(得分:0)

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

a - &gt; AO; o - &gt; k(a - > ao - > ak); ak - &gt; Ø

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

答案 3 :(得分:0)

试试这个(适用于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)

您可以轻松添加规则。

如果有&#34;循环&#34;它也有效。 (例如,添加'k':'a'会使循环a - &gt; o - &gt; k - &gt; a)。

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