Odpowiedź zaproponowana przez @nhahtdh jest poprawna, ale ja twierdzę, że jest mniej pytonowa niż przykład kanoniczny, który używa mniej kodu nieprzezroczystego niż jego regex manipuluje i wykorzystuje wbudowane struktury danych Pythona i funkcję anonimowej funkcji.
Słownik tłumaczeń ma sens w tym kontekście. W rzeczywistości, to w jaki sposób Python Cookbook robi, jak pokazano w poniższym przykładzie (skopiowany z ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/)
import re
def multiple_replace(dict, text):
# Create a regular expression from the dictionary keys
regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
# For each match, look-up corresponding value in dictionary
return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
if __name__ == "__main__":
text = "Larry Wall is the creator of Perl"
dict = {
"Larry Wall" : "Guido van Rossum",
"creator" : "Benevolent Dictator for Life",
"Perl" : "Python",
}
print multiple_replace(dict, text)
Tak więc w Twoim przypadku, można wykonać dict trans = {"a": "aa", "b": "bb"}
a następnie przekazać go do multiple_replace
wraz z tekstem chcesz przetłumaczyć. Zasadniczo, cała ta funkcja polega na utworzeniu jednego dużego wyrażenia zawierającego wszystkie wyrażenia regularne do przetłumaczenia, a następnie, po znalezieniu, przesłaniu funkcji lambda do regex.sub
w celu wykonania wyszukiwania słownika tłumaczeń.
Można użyć tej funkcji podczas czytania z pliku, na przykład:
with open("notes.txt") as text:
new_text = multiple_replace(replacements, text.read())
with open("notes2.txt", "w") as result:
result.write(new_text)
mam faktycznie używane dokładnie tę metodę produkcji, w przypadku, gdy musiałem tłumaczyć miesięcy w roku od Czeski na angielski dla zadania skrobania stron internetowych.
Jak podkreślił @nhahtdh, jedną z wad tej metody jest to, że nie jest ona wolna od przedrostków: klucze słownikowe będące przedrostkami innych kluczy słownika powodują przerwanie metody.
Wow, dzięki, prawie to, czego szukałem. Mam jeszcze jedno podstawowe pytanie: jak zignorować wielkie litery? Więc gdybym miał A i chciałem to przetłumaczyć na aa bez dodawania go do słownika. – Euridice01
@ Euridice01: Jeśli chcesz zignorować wielkość liter, podaj flagę 're.I' w' re.compile'. – nhahtdh
Twoje obecne rozwiązanie nie jest jeszcze skonfigurowane do użycia w przypadku, gdy istnieje para wyrazów, z których jeden jest przedrostkiem drugiego. Kolejność pojawiania się w materii naprzemiennej. Myślę, że przynajmniej powinieneś oświadczyć to założenie. – nhahtdh