我需要将西里尔字母改为拉丁字母(我们只考虑两个字母):
# -*- 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
UPD:谢谢你们,伙计们。根据你的答案,我编写了工作函数:
# -*- 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
答案 0 :(得分:0)
您需要将字典键和字符串更改为unicode字符串,通过为u
添加前缀来执行此操作:
# -*- coding: utf-8 -*-
vac = {'а': 'a', u'б': 'b'}
s = u'абба'
print ''.join([vac.get(c, c) for c in s])
输出:
аbbа
答案 1 :(得分:0)
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