这个问题我一直在思考。 我有一些字符串转换工作的替换规则。我正在学习正则表达式并慢慢找到正确的模式,这没有问题。但是,这里有很多规则,我不能在一个表达式中执行它们。现在这些过程是重叠的。让我举个简单的例子。
想象一下,我想用字符串中的'a'
替换每个'o'
。
我还想在同一个字符串中将每个'o'
替换为'k'
,但是,没有顺序,所以如果我先应用先前的规则,那么转换的'a'
现在将成为'k'
,这根本不是我的意图。因为所有转换必须具有相同的优先级或优先级。我怎样才能克服这个问题?
我使用re.sub()
,但我认为string.replace()
方法存在同样的问题。
非常感谢,谢谢!
答案 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要求的那样)。如果你的正则表达式只是一个字符,并且都是互斥的,那就可以了。如果是这种情况,那么你真的不需要正则表达式(我的上述解决方案就足够了)。如果两个正则表达式匹配(不同长度),你会怎么做?您使用哪一个(因为您不想要任何优先级)?