编码西里尔字母?

2024-04-23 07:33:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在字符串中将西里尔字母改为拉丁字母(让我们只考虑两个字母的缩写):

 # -*- coding: utf-8 -*-
 import re 
 vac = {'а': 'a', 'б': 'b'}
 s = 'абба'
 re.sub('а', vac['а'], s)
 re.sub('б', vac['б'], s)
 print s # works fine, prints "abba" 
 s = 'абба'
 # doesn't work in loop
 for ch in vac:
     s = re.sub(unicode(ch, 'utf-8'), vac[unicode(ch, 'utf-8')], s)
 print s

谢谢你们,伙计们。根据你的回答,我对工作函数进行了编码:

 # -*- coding: utf-8 -*-
 def translit(s):
     symbols = (u"абвгдеёзийклмнопрстуфхъыьэюАБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭЬЬЮ",
     u"abvgdeezijklmnoprstufh'y'euABVGDEEZIJKLMNOPRSTUFH'Y'EU")
     tr = {ord(a):ord(b) for a, b in zip(*symbols)}
     vac = {u'я': 'ya', u'ж': 'zh', u'ц': 'ts', u'ч': 'ch', u'ш': 'sh', u'щ': 'sch', u'Я': 'Ya', u'Ч': 'Ch', u'Ш': 'Sh', u'Щ': 'Sch', u'Ж': 'Zh', u'Ц': 'Ts'}

     s = s.translate(tr)
     s = ''.join([vac.get(c, c) for c in s])
     return s

 s = u"Лорем ипсум, напиши translit'ом"
 a = translit(s)
 print a 

Tags: 字符串inrefor字母unicodechtr
2条回答

Regex不是适合您工作的工具。不幸的是,unicode.encode无法以统一的方式转换为latin,因此最好使用unicode.translate

# -*- coding: utf-8 -*-
symbols = (u"абвгдеёзийклмнопрстуфхъыьэАБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ",
           u"abvgdeezijklmnoprstufh'y'eABVGDEEZIJKLMNOPRSTUFH'Y'E")
tr = {ord(a):ord(b) for a, b in zip(*symbols)}
s = u'абба'
print s.translate(tr)

好处是,您不需要在循环中运行它

您还可以尝试python包transliterate

您需要将字典键和字符串更改为unicode字符串,请在前面加上u

# -*- coding: utf-8 -*-
vac = {'а': 'a', u'б': 'b'}
s = u'абба'
print ''.join([vac.get(c, c) for c in s])

输出:

аbbа

相关问题 更多 >