Reguläre Ausdrücke mit Python 3

Reguläre Ausdrücke mit Python 3
Regelmäßige Ausdrücke werden oft als diese wirklich obskure Reihe von Hieroglyphen angesehen, die man normalerweise aus dem Internet kopiert und in seinen Code pastet. Dieser mysteriöse Zauber zeigt dann magische Fähigkeiten, Muster in Textstaaten zu finden, und wenn wir ihn gut fragen.

Wenn Sie beispielsweise Handler für URL schreiben (und Gott hilft Ihnen, wenn Sie einen von Grund auf neu schreiben), möchten Sie oft das gleiche Ergebnis zeigen, unabhängig vom Nachverfolgung '/' in der URL. E.g https: // Beispiel.Com/Benutzer/Einstellungen/und https: // Beispiel.COM/Benutzer-/Einstellungen sollten trotz des nachverfolgenden '/' auf dieselbe Seite hinweisen.

Sie können jedoch nicht alle Vorwärts -Schrägstriche ignorieren, wie:

  1. Der Stürmer zwischen "Benutzer" und "Einstellungen", E, "Benutzer/Einstellungen".
  2. Außerdem müssen Sie das "//" zu Beginn Ihres FQDN berücksichtigen, gefolgt von "https".

Sie finden also eine Regel wie: „Ignorieren.Und wenn Sie möchten, können Sie diese Regel mit einer Reihe von IF-ELSE-Anweisungen codieren. Aber das wird ziemlich schnell umständlich. Sie können eine Funktion schreiben, die mit CleanUrl () mit der Aufschrift Sie diese für Sie zusammenfassen kann. Aber das Universum wird bald mehr Curveball auf Sie werfen. Sie werden bald Funktionen für CleanHeaders (), Processlog () usw. schreiben. Oder Sie können einen regulären Ausdruck verwenden, wenn eine Art von Musteranpassung erforderlich ist.

Standard -IO und Dateien

Bevor wir uns auf die Details der regulären Ausdrücke einlassen, ist es erwähnenswert, das Modell zu erwähnen, das die meisten Systeme für Textströme haben. Hier ist eine kurze (unvollständige) Zusammenfassung davon:

  1. Der Text wird als (einzelner) Zeichenstrom verarbeitet.
  2. Dieser Stream kann aus einer Datei mit Unicode- oder ASCII -Text oder aus der Standardeingabe (Tastatur) oder aus einer Remote -Netzwerkverbindung stammen. Nach der Verarbeitung durch ein Regex -Skript geht die Ausgabe entweder zu einer Datei oder einem Netzwerkstrom oder zur Standardausgabe (e.G, Konsole)
  3. Der Stream besteht aus einer oder mehreren Zeilen. Jede Zeile hat null oder mehr Zeichen, gefolgt von einer neuen Zeile.

Aus dem Einfachheit halber möchte ich, dass Sie sich vorstellen, dass eine Datei aus Zeilen besteht, die mit einem neuen Zeilenzeichen enden. Wir unterteilen diese Datei in einzelne Zeilen (oder Zeichenfolgen), die jeweils entweder mit einer neuen Zeile oder einem normalen Zeichen enden (für die letzte Zeile).

Regexs und String

Ein Regex hat nichts Besonderes mit Dateien zu tun. Stellen Sie sich vor, es als schwarze Box, die eine beliebige Zeichenfolge einer (endlichen) Länge als Eingabe annehmen kann und sobald es das Ende dieser Zeichenfolge erreicht, kann sie entweder:

  1. Akzeptiere die Zeichenfolge. Mit anderen Worten, die Zeichenfolge Streichhölzer der reguläre Ausdruck (Regex).
  2. Die Zeichenfolge ablehne, ich.e, die Zeichenfolge nicht passen der reguläre Ausdruck (Regex).

Trotz seiner schwarzen Box-Y-Natur werde ich dieser Machinär ein paar weitere Einschränkungen verleihen. Ein Regex liest eine Zeichenfolge der Reihe nach, von links nach rechts, und es liest nach dem anderen nur einen Charakter. Also eine Zeichenfolge "LinuxHint" mit gelesen als:

'L "i" n "u" x "h" i "n" t' [von links nach rechts]

Fangen wir einfach an

Die simpistischste Art von Regex wäre es, nach einer Zeichenfolge 'C' zu suchen und sie abzustimmen. Der reguläre Ausdruck dafür ist nur 'C'. Ziemlich trivial. Der Weg, dies in Python zu tun Betreff Modul für reguläre Ausdrücke.

>>> Import Re

Wir verwenden dann die Funktion RE.suchen(Muster, Zeichenfolge) Wo Muster ist unser regulärer Ausdruck und Saite In der Eingangszeichenfolge, in der wir nach dem Muster suchen.

>>> re.Suche ('C', 'Dieser Satz enthält ein absichtliches C'))

Die Funktion nimmt das Muster 'C' auf, sucht es in der Eingangszeichenfolge und druckt den Ort (Spannweite) wo das besagte Muster gefunden wird. Dieser Teil der Zeichenfolge, dieses Substring, entspricht unserem regulären Ausdruck. Wenn es keine solche Übereinstimmungsausgabe gäbe, wäre eine Ausgabe a Keiner Objekt.

In ähnlicher Weise können Sie wie folgt nach dem Muster "regulärer Ausdruck" suchen:

>>> re.Suche („regulärer Ausdruck“, „Wir können reguläre Ausdrücke zum Suchen von Mustern verwenden.”))

Betreff.search (), re.Match () und Re.gesamtes Spiel()

Zu den drei nützlichen Funktionen aus dem RE -Modul gehören:

Betreff.suchen(Muster, Zeichenfolge)

Dies kehrt das Substring zurück, das dem Muster entspricht, wie wir oben gesehen haben. Wenn kein Übereinstimmung gefunden wird, dann wird dann gefunden Keiner ist zurück gekommen. Wenn mehrere Substrings einem bestimmten Muster entsprechen, wird nur das erste Ereignis gemeldet.

Betreff.passen(Muster, Zeichenfolge)

Diese Funktion versucht, das angegebene Muster vom Anfang der Zeichenfolge abzustimmen. Wenn es irgendwo auf halbem Weg eine Pause begegnet Keiner.

Zum Beispiel,

>>> re.Match ("Joh", "John Doe")

Wo wie die Zeichenfolge „Mein Name ist John Doe“ ist kein Match und daher Keiner ist zurück gekommen.

>>> drucken (RE.Match ("Joh", "Mein Name ist John Doe"))
Keiner

Betreff.gesamtes Spiel(Muster, Zeichenfolge)

Dies ist strenger als die oben genannten und versucht, eine genaue Übereinstimmung des Musters in der Zeichenfolge zu finden, sonst standardmäßig Keiner.

>>> drucken (RE.fullmatch ("joh", "joh"))

# Alles andere wird kein Match sein

Ich werde nur die verwenden Betreff.suchen() Funktion im Rest dieses Artikels. Wann immer, ich sage, der Regex akzeptiert diese Zeichenfolge, bedeutet dies, dass Athe Betreff.suchen() Die Funktion hat in der Eingabezeichenfolge ein übereinstimmendes Substring gefunden und diese anstelle von zurückgegeben KeinerObjekt.

Spezielle Charaktere

Regelmäßige Ausdrücke wie 'John' und 'C' sind nicht sehr nützlich. Wir brauchen Sonderzeichen, die im Kontext regulärer Ausdrücke ein spezifischer Mittelwert sind. Hier sind einige Beispiele:

    1. ^ - Dies entspricht dem Beginn einer Zeichenfolge. Zum Beispiel entspricht '^c' alle Zeichenfolgen, die mit dem Buchstaben c beginnen.
    2. $ - Dies entspricht dem Ende der Linie.
    3. . - Der Punkt soll ein oder mehrere Zeichen angeben, außer der Newline.
    4. * - Dies ist auf null oder mehr Charakter dessen, was ihm vorausging. Also entspricht B* 0 oder mehr Vorkommen von B. AB* passt nur zu A, AB und a
    5. + - Dies ist zu einem oder mehreren Charakter dessen, was ihm vorausging. Also entspricht B+ 1 oder mehr Vorkommen von B. AB* passt nur zu A, AB und a
    6. \ - Backslash wird als Escape -Sequenz in den Regexen verwendet. Sie möchten also einen regelmäßigen Ausdruck, der nach der wörtlichen Präsenz von Dollarsymbol '$' anstelle des Ende der Linie sucht. Sie können \ $ im regulären Ausdruck schreiben.
    7. Lockige Zahnspangen können verwendet werden, um die Anzahl der Wiederholungen anzugeben, die Sie sehen möchten. Beispielsweise bedeutet ein Muster wie AB 10 die Zeichenfolge A, gefolgt von 10 B, entspricht diesem Muster. Sie können auch eine Reihe von Zahlen angeben, z. Das Muster für 4 oder mehr Wiederholungen würde nur ein nachfolgendes Komma erfordern, wie so B 4,
    8. Quadratklammern und Charakterseite. Re mögen [0-9] kann sich wie ein Platzhalter für jede Ziffer zwischen 0 und 9 verhalten. In ähnlicher Weise können Sie Ziffern zwischen einem und fünf [1-5] oder einem beliebigen Großbuchstaben verwenden, der [a-z] oder für einen beliebigen Buchstaben des Alphabets verwendet wird, unabhängig davon, ob es sich um den oberen oder Kleinbuchstaben handelt [A-Z].
      Zum Beispiel entspricht jede Zeichenfolge aus genau zehn Ziffern mit dem regulären Ausdruck [0-9] 10, sehr nützlich, wenn Sie in einer bestimmten Zeichenfolge nach Telefonnummern suchen.
    9. Sie können eine oder gleiche Anweisung erstellen, indem Sie | verwenden Charakter, bei dem ein regulärer Ausdruck aus zwei oder mehr regulären Ausdrücken besteht, z. B. A und B. Die Regex A | B ist eine Übereinstimmung, wenn die Eingangszeichenfolge entweder für den regulären Ausdruck A oder für B übereinstimmt.
    10. Sie können verschiedene Regexes zusammen gruppieren. Zum Beispiel stimmt der Regex (a | b) c Regexes für ac und überein

Es gibt noch viel mehr zu decken, aber ich würde empfehlen, das Lernen zu lernen, anstatt Ihr Gehirn mit vielen obskuren Symbolen und Kantenfällen zu überladen. Im Zweifelsfall sind die Python -Dokumente eine große Hilfe und jetzt wissen Sie genug, um den Dokumenten leicht zu folgen.

Praktische Erfahrungen und Referenzen

Wenn Sie eine visuelle Interpretation Ihres Regex sehen möchten, können Sie Debuggex besuchen. Diese Site generiert in Echtzeit eine Ansicht Ihres Regex.

Um mehr über den theoretischen Aspekt der regulären Ausdrücke zu erfahren, möchten Sie sich vielleicht die ersten Kapitel der Einführung in die Theorie der Berechnung von Michael Sipser ansehen. Es ist sehr leicht zu befolgen und zeigt die Bedeutung regulärer Ausdrücke als Kernkonzept der Berechnung selbst!