【问题标题】:How can I change the last letters of a word in a different language?如何更改不同语言中单词的最后一个字母?
【发布时间】:2015-11-14 09:43:13
【问题描述】:

我需要我的代码来识别单词末尾的特定希伯来语字母,然后用它们的形式替换它们作为最终字母。 例如:כ=ך,מ=ם,נ=ן,פ=ף,צ=ץ。
我尝试使用以下代码:

# -*- coding: utf-8 -*-
from string import maketrans

text = "לנמנמ זה כיפ"
textSplit = text.split()
translator = maketrans("כמנפצ","ךםןףץ")
correctSpelling = ""

for i in textSplit:
    if i[-1]=="כ" or i[-1]=="מ":
        correctSpelling += i.translate(translator) + " "
    else:
        correctSpelling += i + " "

print correctSpelling

输出:לנמנמ זה כיפ。
预期输出:לנמנם זה כיף。
上面的代码没有错误。
在阅读 Unicode HOWTOOvercoming frustration: Correctly using unicode in python2 和每个软件开发人员绝对、绝对必须了解 Unicode 和字符集(没有任何借口!)之后,是时候询问 stackoverflow 了。

【问题讨论】:

  • 那么,您是遇到错误还是...?
  • 请详细说明问题,包括您收到的任何错误,以及预期输出与实际输出。
  • 看起来您通过切换intabouttab 参数混淆了对maketrans 的调用。即,如果您想将a 替换为1b 替换为2 等,您应该使用translator = maketrans('abc','123')
  • 原代码中maketrans的顺序没问题,这里改成了从右到左。
  • 答案实际上是您链接的第二篇文章的第一段

标签: python unicode utf-8 hebrew


【解决方案1】:

您使用了错误的数据类型。在 Python 2 中,字符串(如 'abc')用于字节,Unicode(如 u'abc')用于文本。

所以:

# wrong (putting unicode characters in byte literals is ill-defined):
ord("צ");
# correct:
ord(u"צ");

(Python 3 反转了这一点,'abc' 是 unicode 并且字节有一个明确的 b 前缀)

【讨论】:

  • 谢谢!这确实为我指明了正确的方向,尽管在这种情况下解决方案与 ord 和 chr 没有任何关系。
【解决方案2】:

答案是在任何地方都使用 Unicode 字符串,以及将 Unicode 序数映射到 Unicode 序数的 Unicode 转换表。此版本适用于 Python 2.7 和 Python 3.3+。

# -*- coding: utf-8 -*-
from __future__ import print_function

text = u"לנמנמ זה כיפ"

textSplit = text.split()
translator = {ord(a):ord(b) for a,b in zip(u"כמנפצ",u"ךםןףץ")}
correctSpelling = u""
print(u"כפצנמ".translate(translator)) #just a test for the translator

for i in textSplit:
    if i[-1]==u"כ" or i[-1]==u"מ" or i[-1]==u"נ" or i[-1]==u"פ" or i[-1]==u"צ":
        correctSpelling += i[:-1] + i[-1].translate(translator) + u" "
    else:
        correctSpelling += i + " "

print(correctSpelling)

输出:

ךףץןם
לנמנם זה כיף 

【讨论】:

    【解决方案3】:

    使用 Unicode 字符串来表示文本。

    这是一个与 Python 2/3 兼容的单一源代码,它使用正则表达式将最后一个字母替换为最后一个字母的形式:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    import re
    
    text = "לנמנמ זה כיפ"
    
    final_letters = dict(zip(map(ord, "כמנפצ"),"ךםןףץ"))
    print(re.sub(r'\w\b', lambda m: m.group().translate(final_letters), text,
                 flags=re.UNICODE))
    

    输出

    לנמנם זה כיף
    

    尽管出现了括号,但代码仍然有效(可能是一些从右到左相关的问题)。

    【讨论】:

      【解决方案4】:

      在又修改了我的代码几次(阅读:小时)之后,我发现了问题所在。
      显然我的代码中有两件事是错误的:首先我认为编码已经是 utf-8,其次我认为 .translate(translator) 可以使用 unicode 数据类型。
      为了解决第一个问题,我添加了这一点:

      import sys
      reload(sys)
      sys.setdefaultencoding('utf8')
      

      在那之后,我将文本更改为 unicode 数据类型(而不是 str)并修改了一些代码,如下所示:

      if i[-1]=="כ" or i[-1]=="מ" or i[-1]=="נ" or i[-1]=="פ" or i[-1]=="צ":
              correctSpelling += i[:-1] + str(i[-1]).translate(translator) + " "
      

      所以这里是修改后的完整代码:

          # -*- coding: utf-8 -*-
      from string import maketrans
      import sys
      
      reload(sys)
      sys.setdefaultencoding('utf8')
      
      #the text is of data type unicode
      text = u"לנמנמ זה כיפ"
      
      textSplit = text.split()
      translator = maketrans("כמנפצ","ךםןףץ")
      correctSpelling = ""
      print "כפצנמ".translate(translator) #just a test for the translator
      
      for i in textSplit:
          if i[-1]=="כ" or i[-1]=="מ" or i[-1]=="נ" or i[-1]=="פ" or i[-1]=="צ":
              correctSpelling += i[:-1] + str(i[-1]).translate(translator) + " "
          else:
              correctSpelling += i + " "
      
      print correctSpelling
      

      输出:

      ךףץןם
      לנמנם זה כיף 
      

      【讨论】:

      • reload(sys) 技巧不是解决方案。没有这个技巧setdefaultencoding 是有原因的。我将添加一个避免该技巧的答案。
      • 这个答案混合了字节串(字节序列)和 Unicode 字符串(Unicode 代码点序列),这就是你必须破解 sys.getdefaultencoding() 的原因。不要这样做,使用 Unicode 来表示文本,例如,正如我在回答中所展示的那样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 2020-02-03
      相关资源
      最近更新 更多