【问题标题】:Translate combination of characters into another character (or another combination) [duplicate]将字符组合翻译成另一个字符(或另一个组合)[重复]
【发布时间】:2016-10-05 06:54:37
【问题描述】:

好的,所以我得到了这个特殊的任务:)

假设我们有一个string 的字符(一个单词),它需要被翻译成另一个字符串。

使用string.maketransstring.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 不是预期的……

【问题讨论】:

  • @WiktorStribiżew 尝试了这种方法 - 它不起作用它返回 aiakotiopu for d = { 'ai': 'e', 'ei': 'i', 'oi': 'i', 'o' : 'o', 'a' : 'a', 'w' : 'o', 'y' : 'u' }
  • 是因为join不守序。
  • @WiktorStribiżew 嗯......那么你有什么建议?有办法解决吗?
  • 使用OrderedDict,见this demo
  • 查看我建议的链接:请注意,在这种情况下,如果您的某些字典条目是其他字典条目的子字符串,则应按长度降序对单词进行排序。 所以,问题对我来说仍然是重复的。

标签: python string


【解决方案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

【讨论】:

  • 你不能谈论 | 是否贪婪,因为术语“贪婪”适用于正则表达式量词,而 | 是一个交替运算符。第一个匹配项使正则表达式引擎跳过 Python re 中的所有其他选项,这是所有 NFA 正则表达式中的常见行为。
  • 不确定你所说的理论上是什么意思(?p) in PyPi regex 在实践中就是这样做的。
  • | 不能贪心,因为它是一个量词。我上面的评论纯属术语评论,无需争论。正则表达式不是一件容易的事,坚持使用广泛接受的术语是合理的,以便淹没在这个话题中。
  • 非常感谢,您的 (cdlane) 和 @WiktorStribiżew (使用 OrderedDict) 似乎都有效:)
  • 我的意思不是量词。我是个大忙人,打字时会出错。
猜你喜欢
  • 1970-01-01
  • 2014-06-22
  • 2016-07-28
  • 2019-03-22
  • 1970-01-01
  • 2022-01-13
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多