Python

Reguläre Ausdrücke mit Python 3

Reguläre Ausdrücke mit Python 3
Reguläre Ausdrücke werden oft als diese wirklich obskure Reihe von Hieroglyphen angesehen, die man normalerweise aus dem Internet kopiert und in seinen Code einfügt. Dieser mysteriöse Zauber zeigt dann magische Fähigkeiten, Muster in Textketten zu finden, und wenn wir ihn nett fragen, wird er uns sogar den Gefallen tun, ein gegebenes Muster innerhalb einer Zeichenkette durch etwas Schöneres zu ersetzen.

Wenn Sie beispielsweise Handler für eine URL schreiben (und Gott helfe Ihnen, wenn Sie eine von Grund auf neu schreiben), möchten Sie oft das gleiche Ergebnis anzeigen, unabhängig vom nachgestellten '/' in der URL. E.g https://Beispiel.com/user/settings/ und https://Beispiel.com/user/settings sollten trotz des abschließenden '/' auf dieselbe Seite verweisen. 

Sie können jedoch nicht alle Schrägstriche ignorieren, wie zum Beispiel:

  1. Der Schrägstrich zwischen 'user' und 'settings', e, 'user/settings'.
  2. Außerdem müssen Sie das '//' am Anfang Ihres FQDN berücksichtigen, gefolgt von 'https'.

Also erfinden Sie eine Regel wie: „Ignoriere nur die Schrägstriche gefolgt von Leerzeichen.” und wenn Sie möchten, können Sie diese Regel mit einer Reihe von if-else-Anweisungen codieren. Aber das wird recht schnell umständlich. Sie können eine Funktion schreiben, die cleanUrl() sagt, die dies für Sie kapseln kann. Aber das Universum wird bald mehr Curveballs auf dich werfen. Sie werden bald feststellen, dass Sie Funktionen für cleanHeaders(), processLog() usw. schreiben. Oder Sie können einen regulären Ausdruck verwenden, wenn eine Art von Mustervergleich erforderlich ist.

Standard-E/A und Dateien

Bevor wir auf die Details von regulären Ausdrücken eingehen, ist es erwähnenswert, welches Modell die meisten Systeme für Textströme haben. Hier ist eine kurze (unvollständige) Zusammenfassung davon:

  1. Text wird als (einzelner) Zeichenstrom verarbeitet.
  2. Dieser Stream kann aus einer Datei mit Unicode- oder ASCII-Text oder aus einer Standardeingabe (Tastatur) oder aus einer entfernten Netzwerkverbindung stammen. Nach der Verarbeitung, beispielsweise durch ein Regex-Skript, geht die Ausgabe entweder an einen Datei- oder Netzwerkstream oder an die Standardausgabe (z.g, Konsole)
  3. Der Stream besteht aus einer oder mehreren Zeilen. Jede Zeile hat null oder mehr Zeichen gefolgt von einem Zeilenumbruch.

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

Regex und String

Eine Regex hat nichts Besonderes mit Dateien zu tun. Stellen Sie es sich als Blackbox vor, die jeden beliebigen String beliebiger (endlicher) Länge als Eingabe annehmen kann, und sobald es das Ende dieses Strings erreicht hat, kann es entweder:

  1. Akzeptiere die Zeichenfolge. Mit anderen Worten, die Zeichenfolge Streichhölzer der reguläre Ausdruck (regex).
  2. Lehnen Sie die Zeichenfolge ab, i.e, die Zeichenfolge nicht Spiel der reguläre Ausdruck (regex).

Trotz seiner Black-Box-artigen Natur werde ich dieser Maschine noch ein paar weitere Einschränkungen hinzufügen. Eine Regex liest einen String der Reihe nach, von links nach rechts, und es wird jeweils nur ein Zeichen gelesen. Also eine Schnur „Linux-Hinweis“ mit gelesen werden als:

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

Fangen wir einfach an

Die einfachste Art von Regex wäre, nach einer Zeichenfolge 'C' zu suchen und sie abzugleichen. Der reguläre Ausdruck dafür ist einfach 'C'. Ganz trivial. Um dies in Python zu tun, müssen Sie zuerst die Re Modul für reguläre Ausdrücke.

>>> Importieren

Wir verwenden dann die Funktion re.Suche(Muster, Schnur) wo Muster ist unser regulärer Ausdruck und Schnur im Eingabestring, in dem wir nach dem Muster suchen.

>>> re.search('C', 'Dieser Satz enthält ein bewusstes C')

Die Funktion nimmt das Muster 'C' auf, sucht es im Eingabestring und gibt den Ort aus (span) wo das besagte Muster gefunden wird. Dieser Teil des Strings, dieser Teilstring, entspricht unserem regulären Ausdruck. Wenn keine solche Übereinstimmung gefunden wurde, wäre die Ausgabe a Keiner Objekt.

Ebenso können Sie wie folgt nach dem Muster 'regulärer Ausdruck' suchen:

>>>re.search("regulärer Ausdruck","Wir können reguläre Ausdrücke für die Suche nach Mustern verwenden.“)

Re.search() , re.match() und re.gesamtes Spiel()

Drei nützliche Funktionen aus dem re-Modul sind:

1.  Re.Suche(Muster, Schnur)

Dies gibt den Teilstring zurück, der dem Muster entspricht, wie wir oben gesehen haben. Wenn keine Übereinstimmung gefunden wird, dann Keiner ist zurück gekommen. Wenn mehrere Teilzeichenfolgen einem bestimmten Muster entsprechen, wird nur das erste Auftreten gemeldet.

2.  Re.Spiel(Muster, Schnur)

Diese Funktion versucht, das angegebene Muster vom Anfang des Strings an zu finden. Wenn es irgendwo in der Mitte auf einen Bruch stößt, kehrt es zurück Keiner.

Beispielsweise,

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

Wobei die Zeichenfolge „My name is John Doe“ keine Übereinstimmung ist und daher Keiner ist zurück gekommen.

>>> drucken (re.match("Joh", "Mein Name ist John Doe"))
Keiner

3.  Re.gesamtes Spiel(Muster, Schnur)

Dies ist strenger als die beiden oben genannten und versucht, eine genaue Übereinstimmung des Musters in der Zeichenfolge zu finden, andernfalls ist die Standardeinstellung Keiner.

>>> drucken (re.fullmatch("Joh", "Joh"))

# Alles andere passt nicht zusammen

Ich werde nur die verwenden Re.Suche() Funktion im Rest dieses Artikels. Immer wenn ich sage, dass die Regex diese Zeichenfolge akzeptiert, bedeutet dies, dass athe Re.Suche() Die Funktion hat eine passende Teilzeichenfolge in der Eingabezeichenfolge gefunden und diese anstelle von . zurückgegeben KeinerObjekt.

Spezielle Charaktere

Reguläre Ausdrücke wie 'John' und 'C' sind nicht von großem Nutzen. Wir brauchen Sonderzeichen, die im Kontext von regulären Ausdrücken eine bestimmte Bedeutung haben. Hier ein paar Beispiele:

    1. ^ - Dies entspricht dem Anfang einer Zeichenfolge. '^C' entspricht beispielsweise allen Zeichenfolgen, die mit dem Buchstaben C . beginnen.
    2. $ - Dies entspricht dem Zeilenende.
    3. . - Der Punkt soll ein oder mehrere Zeichen anzeigen, außer dem Zeilenumbruch.
    4. * - Dies ist null oder mehr Zeichen dessen, was davor war. Also passt b* zu 0 oder mehr Vorkommen von b. ab* passt nur zu a, ab und a
    5. + - Dies ist ein oder mehrere Charaktere dessen, was ihm vorausgegangen ist. 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 Regexes verwendet. Sie möchten also, dass ein regulärer Ausdruck nach dem wörtlichen Vorhandensein des Dollarsymbols '$' anstelle des Zeilenendes sucht. Sie können \$ in regulären Ausdrücken schreiben.
    7. Geschweifte Klammern können verwendet werden, um die Anzahl der Wiederholungen anzugeben, die Sie sehen möchten. Zum Beispiel bedeutet ein Muster wie ab10, dass die Zeichenfolge a gefolgt von 10 b diesem Muster entspricht. Sie können auch einen Zahlenbereich angeben, wie b4,6 entspricht Strings, die b enthalten, die 4 bis 6 Mal hintereinander wiederholt werden. Das Muster für 4 oder mehr Wiederholungen würde nur ein nachgestelltes Komma erfordern, wie zum Beispiel b4,
    8. Eckige Klammern und Zeichenbereich. RE wie [0-9] kann als Platzhalter für jede Ziffer zwischen 0 und 9 . fungieren. In ähnlicher Weise können Sie Ziffern zwischen eins und fünf [1-5] verwenden oder für einen beliebigen Großbuchstaben [A-Z] oder für jeden Buchstaben des Alphabets, unabhängig davon, ob es sich um Groß- oder Kleinbuchstaben handelt, [A-z] verwenden.
      Zum Beispiel passt jede Zeichenfolge, die aus genau zehn Ziffern besteht, auf den regulären Ausdruck [0-9]10, was sehr nützlich ist, wenn Sie nach Telefonnummern in einer bestimmten Zeichenfolge suchen.
    9. Sie können eine OR-ähnliche Anweisung erstellen, indem Sie | . verwenden Zeichen, 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 Eingabezeichenfolge entweder mit dem regulären Ausdruck A oder mit B übereinstimmt.
    10. Sie können verschiedene Regexes gruppieren. Zum Beispiel stimmt die Regex (A|B)C mit den Regexes für AC und . überein

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

Praktische Erfahrung und Referenzen

Wenn Sie eine visuelle Interpretation Ihrer Regex sehen möchten, besuchen Sie Debuggex. Diese Site generiert in Echtzeit eine Ansicht Ihrer Regex und lässt Sie sie mit verschiedenen Eingabezeichenfolgen testen.

Um mehr über den theoretischen Aspekt von Regulären Ausdrücken zu erfahren, sollten Sie sich die ersten Kapitel der Einführung in die Rechentheorie von Michael Sipser ansehen. Es ist sehr einfach zu befolgen und zeigt die Bedeutung von regulären Ausdrücken als Kernkonzept der Berechnung selbst!

Beste Spiele zum Spielen mit Handtracking
Oculus Quest hat kürzlich die großartige Idee des Hand-Trackings ohne Controller vorgestellt. Mit einer ständig steigenden Anzahl von Spielen und Akti...
So zeigen Sie OSD-Overlay in Vollbild-Linux-Apps und -Spielen an
Das Spielen von Spielen im Vollbildmodus oder die Verwendung von Apps im ablenkungsfreien Vollbildmodus kann Sie von relevanten Systeminformationen ab...
Top 5 Karten zur Spielaufnahme
Wir alle haben Streaming-Gameplays auf YouTube gesehen und geliebt. PewDiePie, Jakesepticye und Markiplier sind nur einige der Top-Gamer, die Millione...