Python 如何更改不同语言中单词的最后几个字母?

Python 如何更改不同语言中单词的最后几个字母?,python,unicode,utf-8,hebrew,Python,Unicode,Utf 8,Hebrew,我需要我的代码来识别单词末尾的特定希伯来语字母,然后用它们的形式替换为最终字母。 例如:כ=ך,מ=ם,נ=ן,פ=ף,צ=ץ。 我尝试使用以下代码进行此操作: # -*- coding: utf-8 -*- from string import maketrans text = "לנמנמ זה כיפ" textSplit = text.split() translator = maketrans("כמנפצ","ךםןףץ") correctSpelling = "" for i

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

# -*- 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和字符集(没有借口!),是时候询问stackoverflow了。

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

因此:


(Python3反过来说,
'abc'
是unicode,字节有一个显式的
b
前缀)

在对我的代码进行了几次修改后(读:小时),我发现了问题所在。
显然,我的代码中有两件事是错误的:首先,我假设编码已经是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
输出:

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

答案是在任何地方使用Unicode字符串,以及将Unicode序号映射到Unicode序号的Unicode转换表。此版本将在Python2.7和Python3.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)
输出:

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

使用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))
输出
尽管出现了异常,但代码仍然有效(可能是一些从右到左的相关问题)。

那么,您是否收到了错误,或者…?请详细说明问题,包括您收到的任何错误,以及预期输出与实际输出。通过切换
intab
outtab
参数,您似乎混淆了对
maketrans
的调用。如果你想用
1
b
等替换
a
b
等,你应该有
translator=maketrans('abc','123')
。maketrans在原始代码中的顺序很好,这里它将其改为从右向左。答案实际上是你链接的第二篇文章的第一段。谢谢!这确实为我指明了正确的方向,尽管在本例中解决方案与ord和chr没有任何关系。
reload(sys)
技巧不是解决方案。没有这个技巧,
setdefaultencoding
无法工作是有原因的。我将添加一个避免这种技巧的答案。这个答案混合了ByTestRing(字节序列)和Unicode字符串(Unicode代码点序列),这就是为什么您必须破解
sys.getdefaultencoding()
。不要这样做,使用Unicode来表示文本,如我在回答中所示。
#!/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))
לנמנם זה כיף