Die von @nhahtdh vorgeschlagene Antwort ist gültig, aber ich würde weniger pythonisch argumentieren als das kanonische Beispiel, das Code weniger undurchsichtig als seine Regex verwendet Manipulationen und nutzt die integrierten Datenstrukturen von Python und die anonyme Funktion.
Ein Wörterbuch der Übersetzungen ist in diesem Zusammenhang sinnvoll. In der Tat, das ist, wie das Python-Kochbuch macht es, wie
gezeigt in diesem Beispiel (kopiert von 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)
Also in Ihrem Fall könnten Sie einen dict trans = {"a": "aa", "b": "bb"}
machen und es dann in multiple_replace
passieren zusammen mit dem Text du willst übersetzt werden. Im Grunde besteht diese Funktion nur darin, einen riesigen Regex zu erstellen, der alle zu übersetzenden Regexes enthält, und wenn eine gefunden wird, übergibt man eine Lambda-Funktion an regex.sub
, um das Wörterbuch nachschlagen zu können.
Sie diese Funktion nutzen zu können, während aus der Datei zu lesen, zum Beispiel:
with open("notes.txt") as text:
new_text = multiple_replace(replacements, text.read())
with open("notes2.txt", "w") as result:
result.write(new_text)
ich eigentlich genau dieses Verfahren in der Produktion verwendet habe, in einem Fall, in dem ich die Monate des Jahres zu übersetzen brauchte aus Tschechisch ins Englische für eine Web Scraping Aufgabe. Wie @nhahtdh bemerkte, ist ein Nachteil dieses Ansatzes, dass er nicht frei von Präfixen ist: Dictionary-Schlüssel, die Präfixe anderer Dictionary-Schlüssel sind, führen zum Bruch der Methode.
Wow danke ist ziemlich genau das, was ich gesucht habe. Ich habe noch eine grundlegende Frage, wie ignoriere ich Großbuchstaben? Wenn ich also A hätte und ich das auch in aa übersetzen wollte, ohne es dem Wörterbuch hinzuzufügen. – Euridice01
@ Euridice01: Wenn Sie die Groß- und Kleinschreibung ignorieren möchten, geben Sie 're.I' in' re.compile' an. – nhahtdh
Ihre aktuelle Lösung ist noch nicht für den Anwendungsfall konfiguriert, in dem ein Wortpaar existiert, von denen eines das Präfix des anderen ist. Die Reihenfolge des Auftretens im Wechsel ist von Bedeutung. Ich denke, zumindest sollten Sie diese Annahme angeben. – nhahtdh