2014-01-26 51 views
0

我需要改變西裏爾字母到拉丁字母的字符串(我們只考慮兩個用於短字母):編碼cyrilllic字母?

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

你的第一個代碼不能工作,你不會在任何地方存儲're.sub'的輸出。 –

回答

0

您需要更改字典鍵和字符串爲Unicode字符串,做到這一點的前綴一個u

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

輸出:

аbbа 
+0

已修復,但目前無法使用 – user2558053

+0

@ user2558053我已更新答案。 –

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) 

的好處是,你不要;噸需要在循環運行此

您也可以婉; t試試python包transliterate