如何用其他语言更改单词的最后一个字母?

时间:2015-11-12 18:45:17

标签: python unicode utf-8 hebrew

我需要我的代码在单词结尾处识别希伯来语中的特定字母,然后将其替换为最终字母。 例如:כ=ך,מ=ם,נ=ן,פ=ף,צ=ץ。
我尝试使用以下代码执行此操作:

# -*- 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了。

4 个答案:

答案 0 :(得分: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前缀)

答案 1 :(得分:1)

答案是在任何地方使用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)

输出:

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

答案 2 :(得分:1)

使用Unicode字符串表示文本。

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

Array#last

输出

#!/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))

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

答案 3 :(得分:-1)

经过几次修补我的代码(读:小时)后,我发现了问题所在 显然我的代码中有两件事是错的:首先我假设编码已经是utf-8,其次我认为.translate(翻译器)可以使用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

输出:

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