2017-07-03 56 views
1

給出一個多字符單字符字符串翻譯表:替換子表

>>> telex_mappings 
{'eer': 'ể', 'awj': 'ặ', 'Dd': 'Đ', 'Ooj': 'Ộ', 'oox': 'ỗ', 'Aas': 'Ấ', 'Eej': 'Ệ', 'awx': 'ẵ', 'eef': 'ề', 'oo': 'ô', 'aas': 'ấ', 'Aax': 'Ẫ', 'owr': 'ở', 'Uws': 'Ớ', 'Awj': 'Ặ', 'Oor': 'Ổ', 'Awf': 'Ằ', 'ows': 'ớ', 'aaj': 'ậ', 'Owj': 'Ợ', 'aa': 'â', 'eex': 'ễ', 'Oox': 'Ỗ', 'Owr': 'Ở', 'awf': 'ằ', 'Aa': 'Â', 'aw': 'ă', 'awr': 'ẳ', 'uwj': 'ợ', 'uwx': 'ỡ', 'owj': 'ợ', 'Awx': 'Ẵ', 'Uwr': 'Ở', 'Aaj': 'Ậ', 'Eex': 'Ễ', 'Awr': 'Ẳ', 'Uw': 'Ư', 'Eef': 'Ề', 'aaf': 'ầ', 'Aws': 'Ắ', 'ees': 'ế', 'Ee': 'Ê', 'Ow': 'Ơ', 'Ees': 'Ế', 'Owx': 'Ỡ', 'Eer': 'Ể', 'Aar': 'Ẩ', 'Oo': 'Ô', 'uwf': 'ờ', 'uw': 'ư', 'uws': 'ớ', 'owx': 'ỡ', 'ow': 'ơ', 'aar': 'ẩ', 'eej': 'ệ', 'oof': 'ờ', 'ee': 'ê', 'uwr': 'ở', 'Aw': 'Ă', 'ooj': 'ộ', 'Aaf': 'Ầ', 'aax': 'ẫ', 'Oof': 'Ờ', 'oor': 'ổ', 'aws': 'ắ', 'Oos': 'Ớ', 'Uwf': 'Ờ', 'Uwx': 'Ỡ', 'dd': 'đ', 'oos': 'ố', 'Uwj': 'Ợ'} 

>>> telex_mappings['eef'] 
'ề' 
>>> telex_mappings['aaf'] 
'ầ' 
>>> telex_mappings['uw'] 
'ư' 

和輸入字符串:

>>> s = 'Nguyeefn Traafn Anh Thuw' 

所需的功能會是這樣的:

>>> func('Nguyeefn Traafn Anh Thuw') 
'Nguyên Trân Anh Thư' 

我已經試過:

>>> s = 'Nguyeefn Traafn Anh Thuw' 
>>> for k,v in telex_mappings.items(): 
...  s = s.replace(k, v) 
... 
>>> s 
'Nguyền Trâfn Anh Thư' 

但是我們看到有一個'aa'鍵導致替換先發生在'aaf'之前。理想情況下,應該先更換較長的按鍵。

應該如何替換,以便可以從最長鍵開始的鍵值表中替換子字符串?

是否有某種正則表達式方法而不是遍歷映射中的所有鍵值對?

回答

3

這裏是一個可能的正則表達式的解決方案:

import re 

pattern= '|'.join(re.escape(word) for word in sorted(telex_mappings, key=len, reverse=True)) 
result= re.sub(pattern, lambda match:telex_mappings[match.group()], s) 

此排序由長度的字典鍵,然後創建形式key1|key2|key3|...的正則表達式模式,最後用相應的字典值替換該模式的所有出現。

+0

'lambda匹配:telex_mappings [match.group(0)]'是否一樣? – alvas

+0

@alvas [是的,它默認爲'group(0)'。](https://docs.python.org/3/library/re.html#re.match.group) –

+0

Thans @Rawing!然後,我猜'telex_mapping.get(m.group(0),m.group(0))'將很好地避免KeyError =) – alvas

4

排序telex_mappings鍵由長度遞減:

for k in sorted(telex_mappings, key=len, reverse=True): 
    s = s.replace(k, telex_mappings[k]) 
+0

你可以放棄'.keys()' –

+0

@MosesKoledoye對,謝謝。 –