Wie kann ich mehrere Substitutionen mit Regex in Python tun?
Kann ich dieses code unten erstellen Sie eine neue Datei mit der substitution von a
mit aa
mithilfe von regulären Ausdrücken.
import re
with open("notes.txt") as text:
new_text = re.sub("a", "aa", text.read())
with open("notes2.txt", "w") as result:
result.write(new_text)
Ich Frage mich, muss ich diese Linie benutzen, new_text = re.sub("a", "aa", text.read())
mehrfach, aber ersetzen Sie die Zeichenfolge für die anderen Buchstaben, die ich will zu ändern, um zu ändern, mehr als einen Buchstaben in meinem text?
Ist, so a
-->aa
,b
--> bb
und c
--> cc
.
So, ich habe das schreiben, dass die Zeile für all die Briefe, die ich ändern will oder gibt es einen einfacheren Weg. Vielleicht ein "Wörterbuch" der übersetzung. Sollte ich diese Buchstaben in ein array? Ich bin mir nicht sicher, wie Sie Sie zu nennen auf Sie, wenn ich das Tue.
InformationsquelleAutor der Frage Euridice01 | 2013-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort vorgeschlagen von @nhahtdh gültig ist, aber ich würde behaupten, weniger pythonic als das kanonische Beispiel, wird code verwendet, der weniger deckend als seine regex-Manipulationen und nutzt python ' s built-in Daten-Strukturen und anonymen Funktion.
Ein Wörterbuch mit übersetzungen sinnvoll in diesem Zusammenhang. In der Tat, das ist, wie das Python-Kochbuch macht es, wie in diesem Beispiel gezeigt (kopiert von ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/ )
Also in deinem Fall, könnte man ein dict
trans = {"a": "aa", "b": "bb"}
und dann pass es inmultiple_replace
zusammen mit dem text, den Sie übersetzt haben möchten. Im Grunde alle, dass die Funktion dabei ist die Schaffung eines riesigen regex, die alle Ihre regexes zu übersetzen, dann, wenn eine gefunden wird, wobei eine lambda-Funktion zuregex.sub
zum durchführen der übersetzung, Wörterbuch nachschlagen.Könnten Sie diese Funktion verwenden, während Sie Lesen aus der Datei, zum Beispiel:
Ich habe tatsächlich genau dieses Verfahren in der Produktion, in einem Fall, wo ich brauchte, um zu übersetzen die Monate des Jahres aus dem Tschechischen ins englische für eine web-scraping Aufgabe.
Als @nhahtdh wies darauf hin, ein Nachteil dieses Ansatzes ist, dass es nicht Präfix-frei: Wörterbuch, Schlüssel mit Präfixe von anderen Wörterbuch-keys führt dazu, die Methode zu brechen.
InformationsquelleAutor der Antwort Emmett J. Butler
Können Sie die Erfassung der Gruppe und Rückverweis:
Setzen Sie Zeichen, dass Sie verdoppeln wollen, in zwischen
[]
. Für den Fall der Kleinschreibunga
b
c
:In der Ersatz-Zeichenfolge, Sie können finden was auch immer ergänzt durch eine capturing-group
()
mit\n
notation, won
einige positive integer (0 ausgeschlossen).\1
bezieht sich auf die erste capturing group. Es ist eine andere notation\g<n>
won
kann eine beliebige nicht-negative ganze Zahl (0 ist zulässig);\g<0>
beziehen sich auf den gesamten text abgestimmt, die durch den Ausdruck.Wenn Sie verdoppeln wollen, bis alle Zeichen außer neue Zeile:
Wenn Sie verdoppeln wollen, bis alle-Zeichen (neue Zeile) enthalten:
InformationsquelleAutor der Antwort nhahtdh
Mithilfe von Tipps aus wie man eine 'ungesunde' - Klassekönnen wir ein Objekt identisch mit einem string, aber für eine zusätzliche
sub
Methode:Dies ermöglicht die Verwendung der builder-Muster, das sieht schöner aus, funktioniert aber nur für eine vorher festgelegte Anzahl von Substitutionen. Wenn Sie es in einer Schleife, es gibt keine Punkt erstellen eines extra-Klasse mehr. E. g.
InformationsquelleAutor der Antwort Leo
Ich fand, ich hatte zu ändern, Emmett J. Butler ' s code durch ändern der lambda-Funktion zu verwenden myDict.get(mo.Gruppe(1),mo.Gruppe(1)). Der ursprüngliche code war nicht für mich arbeiten; mit myDict.get() liefert auch den nutzen von einem Standardwert, wenn ein Schlüssel nicht gefunden wird.
InformationsquelleAutor der Antwort Jordan McBain