好的,所以我得到了这个特殊的任务:)
假设我们有string
个字符(一个单词),需要将其翻译成另一个字符串。
在其最简单的形式中,使用string.maketrans
和string.translate
来解决此问题。
但是,在我的情况下,第一个字符串中的两个字符组合应该转换为另一个组合或单个字符结果字符串,单个字符可以转换为两个字符的组合,最后可以将单个字符翻译成单个字符,例如
ai -> should become e
oi -> should become i
另一方面
8 -> should become th
但是
w should become o
y should become u
其他字符可能保持不变,例如
a should remain a
o should remain o
所以对于以下输入
aiakotoiwpy
预期输出为
eakotiopu
我想到的一种方法是使用哈希表(用于翻译)并逐个字符地读取输入sting
并执行替换。我想知道是否有更聪明的'进场?
任何有价值的意见都将受到高度赞赏!
感谢。
修改
试过这个(按照建议):
d = {
'ai': 'e',
'ei': 'i',
'oi': 'i',
'o' : 'o',
'a' : 'a',
'w' : 'o',
'y' : 'u'
}
s ="aiakotoiwpy"
pattern = re.compile('|'.join(d.keys()))
result = pattern.sub(lambda x: d[x.group()], s)
但结果是
aiakotiopu
不是预期的......
答案 0 :(得分:1)
|
(交替)操作符只是从左到右尝试匹配。因此,如果我们可以在交替中将两个字符键移动到一个字符键的左侧,那么事情应该更好。我们可以通过反向排序len()
作为我们的关键功能来实现这一点:
import re
d = {
'ai': 'e',
'ei': 'i',
'oi': 'i',
'o': 'o',
'a': 'a',
'w': 'o',
'y': 'u',
}
s = "aiakotoiwpy"
pattern = re.compile('|'.join(sorted(d, key=len, reverse=True)))
result = pattern.sub(lambda x: d[x.group()], s)
print(result)
<强>输出强>
eakotiopu