2017-07-03 3 views
1

ein Multi-char zu einzelnen char string Übersetzungstabelle Gegeben:Substitution Substrings von einem Schlüsselwert-Tabelle

>>> 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'] 
'ư' 

Und der Eingabezeichenfolge:

>>> s = 'Nguyeefn Traafn Anh Thuw' 

Die gewünschte Funktion wäre so etwas wie:

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

ich habe versucht:

Aber wir sehen, dass es einen Schlüssel für 'aa' gibt, der die Ersetzung zuerst vor 'aaf' bewirkt. Idealerweise sollten die längeren Schlüssel zuerst ersetzt werden.

Wie sollte der Austausch so sein, dass es möglich ist, Teilstrings aus einer Schlüsselwerttabelle zu ersetzen, beginnend mit dem längsten Schlüssel?

Gibt es eine Art von Regex-Methoden, anstatt alle Schlüssel/Wert-Paare im Mapping zu durchlaufen?

Antwort

3

Hier ist eine mögliche Regex Lösung:

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) 

Damit wird den Dictionary-Schlüssel nach Länge sortiert, erstellt dann einen RegexMuster der Form key1|key2|key3|... und ersetzt schließlich alle Vorkommen dieses Musters durch den entsprechenden dict -Wert.

+0

Würde 'lambda übereinstimmen: telex_mappings [match.group (0)]' sei das gleiche? – alvas

+0

@alvas [Ja, es ist standardmäßig "Gruppe (0)".] (Https://docs.python.org/3/library/re.html#re.match.group) –

+0

Thans @Rawing! Dann denke ich 'telex_mapping.get (m.group (0), m.group (0))' wäre gut, um den KeyError zu vermeiden =) – alvas

4

Sortieren telex_mappings Schlüssel nach Länge absteigend:

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

Sie können '.keys()' –

+0

@MosesKoledoye Right, thanks. –