Über Python Regex Python Regex ist ein Tool für Python-Programmierer von Kodos 3, die tot ist inspiriert. Ich wollte auch ein bisschen Tornado erkunden. Die async python Rahmen von Facebook Lab und WebSockets. Und starten Sie die Arbeit mit Python 3. Ich wollte auch versuchen, einige laquo Agrave la mode raquo techologies wie CoffeeScript. Python Regex ist urheberrechtlich geschützt Rgis FLORET 2013 und später und ist OpenSource unter GPL2-Lizenz. Quellcode auf Git Hub finden Kontakt aufnehmen Kontakt Nachricht senden Ihre Nachricht wurde erfolgreich verschickt Globale Optionen Mit kurzem Tag bewerten re. I statt re. IGNORECASE Regex-Optionen Debug-Modus (re. DEBUG) Ignore case (re. IGNORECASE) Dot is all Zeichen (re. DOTALL) Seien Sie verbose (re. VERBOSE) Um Ihren regulären Ausdruck zu speichern, müssen Sie sich registrieren. Sie haben die Wahl. Sie können entweder Ihr soziales Netzwerkkonto verwenden oder per E-Mail registrieren. Wir werden niemals Ihr soziales Konto für alles verwenden. 1-Click-Signatur Test online Ihr Python Reguläre AusdrückeRegular Expression HOWTO Dieses Dokument ist ein einleitendes Tutorial zur Verwendung von regulären Ausdrücken in Python mit dem re-Modul. Es bietet eine sanftere Einführung als der entsprechende Abschnitt in der Bibliotheksreferenz. Einführung Das re-Modul wurde in Python 1.5 hinzugefügt und bietet Perl-artige reguläre Expressionsmuster. Frühere Versionen von Python kamen mit dem Regex-Modul, das Emacs-Muster zur Verfügung gestellt. Das Regex-Modul wurde komplett in Python 2.5 entfernt. Reguläre Ausdrücke (genannt REs oder Regexe oder Regex-Muster) sind im Wesentlichen eine winzige, hoch spezialisierte Programmiersprache, die in Python eingebettet ist und über das re Modul zur Verfügung gestellt wird. Unter Verwendung dieser kleinen Sprache können Sie die Regeln für die Menge der möglichen Zeichenfolgen angeben, die Sie mit diesem Satz übereinstimmen möchten. Sie können englische Sätze oder E-Mail-Adressen oder TeX-Befehle oder beliebige Elemente enthalten. Sie können dann Fragen wie 8220Does diese Saite entsprechen dem Muster8221, oder 8220Ist es eine Übereinstimmung für das Muster überall in diesem string8221. Sie können auch REs verwenden, um einen String zu modifizieren oder auf verschiedene Weise voneinander zu trennen. Reguläre Ausdrückmuster werden in eine Reihe von Bytecodes kompiliert, die dann durch eine in C geschriebene übereinstimmende Engine ausgeführt werden. Für fortgeschrittene Anwendungen kann es notwendig sein, sorgfältig darauf zu achten, wie der Motor ein gegebenes RE ausführt und das RE in eine Bestimmte Weise, um einen schnelleren Bytecode zu erzeugen. Optimierung isn8217t in diesem Dokument abgedeckt, weil es erfordert, dass Sie ein gutes Verständnis der passenden Engine8217s Interna haben. Die Sprache des regulären Ausdrucks ist relativ klein und beschränkt, so dass nicht alle möglichen Zeichenfolgenverarbeitungsaufgaben mit regulären Ausdrücken durchgeführt werden können. Es gibt auch Aufgaben, die mit regulären Ausdrücken durchgeführt werden können, aber die Ausdrücke erweisen sich als sehr kompliziert. In diesen Fällen können Sie besser schreibe Python-Code, um die Verarbeitung zu tun, während Python-Code wird langsamer als ein aufwändiger regulärer Ausdruck, wird es wahrscheinlich auch mehr verständlich. Einfache Muster We8217ll beginnen, indem sie über die einfachsten möglichen regulären Ausdrücke lernen. Da reguläre Ausdrücke verwendet werden, um auf Strings zu operieren, beginnen wir mit der häufigsten Aufgabe: passende Zeichen. Für eine detaillierte Erklärung der Computerwissenschaft, die regulären Ausdrücken (deterministische und nicht-deterministische endliche Automaten) zugrundeliegt, können Sie fast jedes Lehrbuch auf dem Schreiben von Compilern beziehen. Passende Charaktere Die meisten Buchstaben und Buchstaben passen einfach zusammen. Beispielsweise wird der reguläre Ausdruckstest genau dem Stringtest entsprechen. (Sie können einen Groß - / Kleinschreibung-Modus aktivieren, der diesen RE-Test zu Test oder TEST sowie dazu später mehr zulassen würde.) Es gibt Ausnahmen von dieser Regel, dass einige Zeichen spezielle Metazeichen sind. Und don8217t passen sich. Stattdessen signalisieren sie, dass etwas Außergewöhnliches aufeinander abgestimmt ist, oder sie andere Teile der RE beeinflussen, indem sie sie wiederholen oder ihre Bedeutung ändern. Ein Großteil dieses Dokuments widmet sich der Diskussion verschiedener Metazeichen und ihrer Handlungen. Hier wird eine vollständige Liste der Metazeichen ihrer Bedeutungen im Rest dieses HOWTO besprochen. Die ersten Metazeichen, die wir betrachten, sind und. They8217re verwendet für die Angabe einer Zeichenklasse, die eine Menge von Zeichen, die Sie möchten übereinstimmen. Zeichen können einzeln aufgelistet werden, oder ein Zeichenbereich kann durch die Angabe von zwei Zeichen und deren Trennung durch ein - angezeigt werden. Zum Beispiel passt abc zu einem der Zeichen a. B. Oder c ist das gleiche wie a-c. Die einen Bereich verwendet, um denselben Satz von Zeichen auszudrücken. Wenn Sie nur Kleinbuchstaben abgleichen möchten, wäre Ihr RE a-z. Metazeichen sind nicht in Klassen aktiv. Zum Beispiel wird akm mit einem der Zeichen a übereinstimmen. K. M. Oder ist gewöhnlich ein metacharacter, aber innerhalb einer Zeichenklasse, die von seiner speziellen Natur beraubt wird. Sie können die Zeichen, die nicht in der Klasse aufgeführt sind, durch Ergänzung des Satzes übereinstimmen. Dies wird durch die Einbeziehung von a als das erste Zeichen der Klasse außerhalb einer Zeichenklasse wird einfach mit dem Zeichen. Zum Beispiel, 5 wird ein beliebiges Zeichen mit Ausnahme von 5. Vielleicht ist das wichtigste Metazeichen der Backslash,. Wie in Python-String-Literalen können dem Backslash verschiedene Zeichen folgen, um verschiedene spezielle Sequenzen zu signalisieren. It8217s auch verwendet, um alle Metazeichen zu entkommen, so können Sie immer noch übereinstimmen sie in Mustern zum Beispiel, wenn Sie eine oder passen müssen. Können Sie ihnen einen Backslash voranstellen, um ihre spezielle Bedeutung zu entfernen: oder. Einige der speziellen Sequenzen, die mit dem Setzen von vordefinierten Sätzen von Zeichen beginnen, die oft nützlich sind, wie z. B. die Menge von Ziffern, die Menge von Buchstaben oder die Menge von allem, was isn8217t Whitespace ist. Die folgenden vordefinierten Spezialsequenzen sind eine Untermenge der verfügbaren. Die entsprechenden Klassen sind für Byte-String-Muster. Eine vollständige Liste der Sequenzen und erweiterten Klassendefinitionen für Unicode-Zeichenfolgenmuster finden Sie im letzten Teil der Regular Expression Syntax. D Entspricht einer beliebigen Dezimalstelle, die der Klasse 0-9 entspricht. D Entspricht einem nicht stelligen Zeichen, das der Klasse 0-9 entspricht. S Entspricht einem beliebigen Leerraumzeichen, entspricht dies der Klasse tnrfv. S Entspricht einem Nicht-Whitespace-Zeichen, das der Klasse tnrfv entspricht. W Entspricht einem beliebigen alphanumerischen Zeichen, das der Klasse a-zA-Z0-9 entspricht. W Gleicht alle nicht alphanumerischen Zeichen, die der Klasse a-zA-Z0-9 entsprechen. Diese Sequenzen können in einer Zeichenklasse enthalten sein. Zum Beispiel,. Ist eine Zeichenklasse, die mit jedem Leerraumzeichen übereinstimmt, oder, oder. . Die letzte Metazeichen in diesem Abschnitt ist. Es passt zu allem außer einem Zeilenumbruch-Zeichen, und there8217s ein alternativer Modus (re. DOTALL), wo es sogar ein Zeilenumbruch entsprechen wird. . Wird häufig verwendet, wo Sie 8220any Zeichen8221 entsprechen möchten. Wiederholen von Dingen In der Lage, verschiedene Mengen von Zeichen zu entsprechen, ist das erste, was reguläre Ausdrücke tun können, die isn8217t bereits mit den Methoden möglich, die auf Strings verfügbar sind. Wenn dies jedoch die einzige zusätzliche Fähigkeit von Registern war, würden sie nicht viel Fortschritte machen. Eine weitere Möglichkeit ist, dass Sie festlegen können, dass Teile der RE eine bestimmte Anzahl von Malen wiederholt werden müssen. Das erste Metazeichen für die Wiederholung von Dingen, die wir betrachten. Doesn8217t stimmt stattdessen mit dem Literalzeichen überein, es legt fest, dass das vorhergehende Zeichen null oder mehr mal anstatt genau einmal übereinstimmen kann. Zum Beispiel wird Katze ct (0 a Zeichen), cat (1 a), caaat (3 a Zeichen) und so weiter. Der RE-Motor hat verschiedene interne Beschränkungen, die sich aus der Größe von C8217s int-Typ, die es von übereinstimmende über 2 Milliarden einer Zeichen, die Sie wahrscheinlich don8217t haben genug Speicher, um eine Zeichenfolge, die große, so dass Sie shouldn8217t in diese Grenze zu laufen. Wiederholungen wie gierig bei der Wiederholung einer RE, wird die passende Maschine versuchen, es so oft wie möglich wiederholen. Wenn später Teile des Musters don8217t übereinstimmen, wird die passende Engine dann sichern und erneut versuchen, mit weniger Wiederholungen. Ein Schritt-für-Schritt-Beispiel wird dies deutlicher machen. Let8217s betrachten den Ausdruck abcdb. Dies entspricht dem Buchstaben a. Null oder mehr Buchstaben aus der Klasse bcd. Und endet schließlich mit einem b. Stellen Sie sich jetzt vor, diese RE gegen die Zeichenkette abcbd anzupassen. Versuchen Sie es erneut. Diesmal ist das Zeichen an der aktuellen Position b. So dass es gelingt. Das Ende der RE ist nun erreicht, und es hat abcb. Dies zeigt, wie die passende Engine geht so weit wie es kann, auf den ersten, und wenn keine Übereinstimmung gefunden wird es dann schrittweise sichern und wiederholen Sie den Rest der RE wieder und wieder. Es wird sichern, bis es null Streichhölzer für bcd versucht hat. Und falls das nachträglich fehlschlägt, wird der Motor folgern, dass der String doesn8217t mit dem RE überhaupt übereinstimmt. Ein weiteres wiederholendes Metacharakter ist. Die ein oder mehrere Male übereinstimmt. Achten Sie sorgfältig auf den Unterschied zwischen und passt null oder mehr Mal, so dass, was immer wiederholt werden kann nicht vorhanden sein, während erfordert mindestens ein Vorkommen. Um ein ähnliches Beispiel zu verwenden, wird Katze Katze (1 a), caaat (3 a 8216s), aber won8217t Übereinstimmung ct. Es gibt zwei weitere Wiederholungsqualifikationen. Das Fragezeichenzeichen. Passt entweder einmal oder null mal können Sie es als Kennzeichnung etwas als optional denken. Zum Beispiel, home-brauen Spiele entweder homebrew oder home-brauen. Die komplizierteste wiederholte Qualifikation ist. Wobei m und n Dezimalzahlen sind. Dieser Qualifizierer bedeutet, dass es mindestens m Wiederholungen und höchstens n sein muss. Zum Beispiel wird ein b mit ab übereinstimmen. Ab Und ab. Es gewann8217t Spiel ab. Die keine Schrägstriche hat oder ab. Die vier hat. In diesem Fall können Sie entweder m oder n weglassen, für den fehlenden Wert wird ein vernünftiger Wert angenommen. Das Weglassen von m wird als untere Grenze von 0 interpretiert, während das Weglassen von n zu einer oberen Grenze der Unendlichkeit 8212 führt, tatsächlich ist die obere Grenze die oben genannte 2-Milliardengrenze, aber das könnte auch unendlich sein. Die Leser eines Reduktionisten können bemerken, dass die drei anderen Qualifikationen alle mit dieser Notation ausgedrückt werden können. ist das gleiche wie . ist äquivalent zu . Und ist die gleiche wie. It8217s besser zu verwenden. . oder. Wenn Sie können, einfach weil they8217re kürzer und leichter zu lesen. Verwenden von regulären Ausdrücken Nun, da wir einige einfache reguläre Ausdrücke betrachtet haben, wie verwenden wir sie tatsächlich in Python. Das re-Modul bietet eine Schnittstelle zum regulären Ausdrucksmodul, so dass Sie REs in Objekte kompilieren und dann Übereinstimmungen mit ihnen durchführen können. Kompilieren regulärer Ausdrücke Reguläre Ausdrücke werden in Musterobjekten kompiliert, die Methoden für verschiedene Operationen wie das Durchsuchen von Musterübereinstimmungen oder das Durchführen von Zeichenkettenersetzungen aufweisen. Repile () akzeptiert auch ein optionales Flags-Argument, das verwendet wird, um verschiedene spezielle Funktionen und Syntaxvariationen zu aktivieren. We8217ll gehen über die verfügbaren Einstellungen später, aber für jetzt ein einziges Beispiel zu tun: Die RE wird an repile () als String übergeben. REs werden als Strings behandelt, weil reguläre Ausdrücke aren8217t Teil der Kern-Python-Sprache sind und keine spezielle Syntax zum Ausdrucken erstellt wurde. (Es gibt Anwendungen, don8217t müssen REs überhaupt, so there8217s keine Notwendigkeit, aufblasen die Sprache Spezifikation, indem sie.) Stattdessen ist das re-Modul einfach ein C-Erweiterungsmodul mit Python, wie die Sockel-oder Zlib-Module. Putting REs in Strings hält die Python-Sprache einfacher, hat aber einen Nachteil, der das Thema des nächsten Abschnitts ist. Die Backslash-Pest Wie bereits erwähnt, verwenden reguläre Ausdrücke den umgekehrten Schrägstrich (), um spezielle Formulare anzugeben oder Sonderzeichen zu verwenden, ohne ihre spezielle Bedeutung aufzurufen. Diese Konflikte mit Python8217s Verwendung der gleichen Zeichen für den gleichen Zweck in Zeichenfolgenliteralen. Let8217s sagen, dass Sie eine RE schreiben möchten, die mit dem String-Abschnitt übereinstimmt. Die in einer LaTeX-Datei zu finden sind. Um herauszufinden, was in dem Programmcode zu schreiben, mit der gewünschten Zeichenfolge abgestimmt werden. Als Nächstes müssen Sie Backslashs und andere Metazeichen entfernen, indem Sie ihnen einen Backslash voranstellen, der zum String-Abschnitt führt. Der resultierende String, der an repile () übergeben werden muss, muss sein. Um dies jedoch als Python-String-Literal auszudrücken, müssen beide Backslashs erneut entschlüsselt werden. Finden Sie alle Teilzeichenfolgen, in denen die RE Übereinstimmungen, und gibt sie als Iterator zurück. Match () und search () return Keine, wenn keine Übereinstimmung gefunden werden kann. Wenn they8217re erfolgreich ist, wird eine Matchobjektinstanz zurückgegeben, die Informationen über die Übereinstimmung enthält: wo sie beginnt und endet, die Teilmenge, die sie übereinstimmt, und vieles mehr. Sie können dies durch interaktives Experimentieren mit dem re Modul erfahren. Wenn Sie Tkinter verfügbar haben, können Sie auch auf Toolsscriptsredemo. py schauen. Ein Demonstrationsprogramm, das in der Python-Distribution enthalten ist. Es erlaubt Ihnen, REs und Zeichenfolgen einzugeben, und zeigt an, ob das RE übereinstimmt oder ausfällt. Redemo. py kann sehr nützlich sein, wenn man versucht, eine komplizierte RE zu debuggen. Phil Schwartz8217s Kodos ist auch ein interaktives Werkzeug zur Entwicklung und Erprobung von RE-Mustern. Dieses HOWTO verwendet den Standard-Python-Interpreter für seine Beispiele. Führen Sie zunächst den Python-Interpreter aus, importieren Sie das re-Modul und kompilieren Sie ein RE: Jetzt können Sie versuchen, verschiedene Zeichenfolgen gegen das RE a-z zu treffen. Eine leere Zeichenfolge shouldn8217t übereinstimmen, da bedeutet 8216one oder mehr Wiederholungen8217. Match () sollte in diesem Fall None zurückgeben, was dazu führt, dass der Interpreter keine Ausgabe druckt. Sie können das Ergebnis von match () explizit ausgeben, um dies zu verdeutlichen. Nun versucht let8217s es auf eine Zeichenfolge, die es, wie Tempo übereinstimmen sollte. In diesem Fall gibt match () ein Match-Objekt zurück. So dass Sie das Ergebnis in einer Variablen für spätere Verwendung speichern sollte. Nun können Sie das Match-Objekt nach Informationen über die passende Zeichenfolge abfragen. Match-Objekt-Instanzen haben auch mehrere Methoden und Attribute die wichtigsten sind: Der Versuch dieser Methoden wird bald klären, ihre Bedeutung: group () gibt die Teilzeichenfolge, die von der RE übereinstimmen. Start () und end () geben den Anfangs - und Endindex der Übereinstimmung zurück. Span () gibt sowohl Start - als auch End-Indizes in einem einzigen Tupel zurück. Da die match () - Methode nur überprüft, ob die RE zu Beginn einer Zeichenfolge übereinstimmt, wird start () immer null sein. Die Methode search () durchsucht jedoch die Zeichenfolge, so dass die Übereinstimmung in diesem Fall nicht mit Null beginnen kann. In den eigentlichen Programmen ist die häufigste Art, das Match-Objekt in einer Variablen zu speichern, und dann überprüfen, ob es None war. Dies sieht normalerweise so aus: Zwei Mustermethoden geben alle Übereinstimmungen für ein Muster zurück. Findall () gibt eine Liste von übereinstimmenden Zeichenketten zurück: findall () muss die gesamte Liste erstellen, bevor sie als Ergebnis zurückgegeben werden kann. Die finditer () - Methode gibt eine Sequenz von Match-Objektinstanzen als Iterator zurück. 1 Module-Level-Funktionen Sie müssen ein Musterobjekt erstellen und seine Methoden aufrufen. Das re-Modul bietet auch Top-Level-Funktionen namens match (). Suche(). finde alle(). Sub (). und so weiter. Diese Funktionen verwenden dieselben Argumente wie die entsprechende Mustermethode, wobei die RE-Zeichenfolge als erstes Argument hinzugefügt wurde und noch keine oder keine Objektobjekt-Instanz zurückgegeben wird. Unter der Haube erzeugen diese Funktionen einfach ein Musterobjekt für Sie und rufen die entsprechende Methode auf. Sie speichern auch das kompilierte Objekt in einem Cache, so dass zukünftige Anrufe mit dem gleichen RE sind schneller. Sollten Sie diese Module-Funktionen verwenden, oder sollten Sie das Muster und rufen Sie seine Methoden selbst Diese Wahl hängt davon ab, wie oft die RE verwendet werden, und auf Ihre persönliche Codierung Stil. Wenn das RE nur an einem Punkt im Code verwendet wird, dann sind die Modulfunktionen wahrscheinlich bequemer. Wenn ein Programm viele reguläre Ausdrücke enthält oder dieselben an mehreren Stellen erneut verwendet, dann könnte es sinnvoll sein, alle Definitionen an einem Ort zu sammeln, in einem Abschnitt des Codes, der alle REs vor der Zeit kompiliert. Um ein Beispiel aus der Standardbibliothek zu nehmen, hier ein Auszug aus dem veralteten xmllib-Modul: Ich ziehe es vor, mit dem kompilierten Objekt zu arbeiten, auch für einmalige Anwendungen, aber nur wenige Menschen werden so viel puristisch sein, wie ich bin . Zusammensetzungsflaggen Zusammenstellungsflags können Sie einige Aspekte von regulären Ausdrücken ändern. Flags sind im re-Modul unter zwei Namen, einem langen Namen wie IGNORECASE und einem kurzen, ein-Buchstaben-Formular wie I. vorhanden. (Wenn Sie mit den Mustermodifikatoren von Perl8217 vertraut sind, verwenden die Ein-Buchstaben-Formulare dieselben Buchstaben die Kurzform Von re. VERBOSE ist zB re. X.) Mehrere Flags können durch bitweises ODER-Verknüpfen spezifiziert werden. I re. M setzt beispielsweise die I - und M-Flags. Hier ist eine Tabelle der verfügbaren Flaggen, gefolgt von einer ausführlicheren Erklärung von jedem. Macht mehrere Escapes wie w. B. S und d abhängig von der Unicode-Zeichen-Datenbank. Führen Sie case-insensitive passende Zeichenklasse und literale Zeichenfolgen übereinstimmen Buchstaben durch Ignorieren Fall. Zum Beispiel wird A-Z Kleinbuchstaben entsprechen, und Spam wird Spam entsprechen. Spam. Oder Spam. Dieses Untergehäuse doesn8217t nehmen die aktuelle Gebietsschema berücksichtigt wird es, wenn Sie auch die LOCALE-Flag gesetzt. Machen w. W. b. Und B. abhängig vom aktuellen Gebietsschema. Gebietsschemata sind ein Merkmal der C-Bibliothek, die dazu beitragen soll, Programme zu schreiben, die Sprachunterschiede berücksichtigen. Zum Beispiel, wenn you8217re Verarbeitung Französisch Text, you8217d wollen in der Lage, w schreiben, um Wörter zu vergleichen, aber w entspricht nur der Zeichenklasse A-Za-z es gewonnen8217t übereinstimmen oder. Wenn Ihr System richtig konfiguriert ist und ein französisches Gebietsschema ausgewählt ist, werden bestimmte C-Funktionen dem Programm mitgeteilt, das auch als Buchstabe betrachtet werden sollte. Das Setzen des LOCALE-Flags beim Kompilieren eines regulären Ausdrucks bewirkt, dass das resultierende kompilierte Objekt diese C-Funktionen für w verwendet, die langsamer ist, aber auch ermöglicht, w französische Wörter zu vergleichen, wie Sie erwarten. (Und haven8217t wurde erklärt, aber they8217ll in Abschnitt hinzugefügt werden Weitere Metazeichen.) Meistens passt nur am Anfang des Strings und stimmt nur am Ende des Strings und unmittelbar vor dem Zeilenende (falls vorhanden) am Ende des Strings. Wenn dieses Flag angegeben ist, passt es am Anfang des Strings und am Anfang jeder Zeile innerhalb des Strings, unmittelbar nach jedem Newline. Ebenso passt das Metazeichen entweder am Ende des Strings und am Ende jeder Zeile (unmittelbar vor jedem Zeilenumbruch). Macht das . Sonderzeichen passen zu einem beliebigen Zeichen, einschließlich eines Zeilenumbruchs ohne dieses Flag,. Wird alles außer einem Zeilenumbruch passen. Machen w. W. b. B. d. D. s und S abhängig von der Unicode-Zeichen-Eigenschaften-Datenbank. Mit dieser Markierung können Sie reguläre Ausdrücke schreiben, die besser lesbar sind, indem Sie mehr Flexibilität für die Formatierung erhalten. Wenn dieses Flag angegeben ist, wird der Whitespace innerhalb der RE-Zeichenfolge ignoriert, es sei denn, der Whitespace befindet sich in einer Zeichenklasse oder mit einem unumgekehrten Backslash. Dieses Flag erlaubt Ihnen auch, Kommentare innerhalb einer RE zu setzen, die von den Kommentaren der Engine ignoriert werden, die von einem that8217s weder in einer Zeichenklasse markiert sind, noch einem unumgekehrten Backslash vorausgehen. Zum Beispiel, hier8217s ein RE, die re. VERBOSE verwendet, um zu sehen, wie viel einfacher es zu lesen ist Ohne die ausführliche Einstellung würde die RE wie folgt aussehen: Im obigen Beispiel wurde Python8217s automatische Verkettung von String-Literalen verwendet, um das RE zu brechen In kleinere Stücke, aber es8217s noch schwieriger zu verstehen als die Version mit re. VERBOSE. Mehr Pattern Power Bisher haben wir nur einen Teil der Features von regulären Ausdrücken abgedeckt. In diesem Abschnitt behandeln wir einige neue Metazeichen, und wie man Gruppen verwendet, um Teile des Textes abzurufen, der abgestimmt wurde. Mehr Metazeichen Es gibt einige Metazeichen, die wir noch nicht behandelt haben. Die meisten von ihnen werden in diesem Abschnitt behandelt werden. Einige der zu erläuternden Metazeichen sind Aussagen von null Breiten. Sie don8217t dazu führen, dass der Motor durch die Zeichenfolge stattdessen voranzutreiben, sie verbrauchen keine Zeichen überhaupt, und einfach Erfolg oder Misserfolg. Beispielsweise ist b eine Aussage, dass sich die aktuelle Position an einer Wortgrenze befindet, wobei die Position n8217t durch das b überhaupt geändert wird. Das bedeutet, dass Behauptungen der nullten Breite niemals wiederholt werden sollten, da sie, wenn sie einmal an einem gegebenen Ort übereinstimmen, offensichtlich unendlich viele Male angepasst werden können. Alternation oder der 8220or8221-Operator. Wenn A und B reguläre Ausdrücke sind, entspricht AB jedem beliebigen String, der entweder A oder B entspricht, eine sehr geringe Präzedenz, um es sinnvoller zu machen, wenn Sie mehrere Zeichenfolgen abwechseln. CrowServo wird entweder Crow oder Servo passen. Nicht Cro. Ein w oder ein S. und ervo. Um ein Literal. benutzen . Oder in eine Zeichenklasse, wie in. Übereinstimmungen am Zeilenanfang. Wenn das Flag MULTILINE nicht gesetzt ist, wird es nur am Anfang des Strings übereinstimmen. Im MULTILINE-Modus entspricht dies auch unmittelbar nach jeder Newline innerhalb der Zeichenfolge. Wenn Sie beispielsweise das Wort From nur am Anfang einer Zeile anpassen möchten, ist das zu verwendende RE von From. Entspricht dem Ende einer Zeile, die als das Ende des Strings definiert ist, oder an beliebiger Stelle, gefolgt von einem Zeilenumbruchzeichen. Um ein Literal. Verwenden oder in eine Zeichenklasse einschließen, wie in. A Stimmt nur am Anfang des Strings. Wenn nicht im MULTILINE-Modus, sind A und effektiv das gleiche. Im MULTILINE-Modus unterscheiden sie sich: A stimmt immer noch nur am Anfang des Strings überein, kann aber an beliebiger Stelle innerhalb der Zeichenfolge übereinstimmen, die einem Zeilenvorschubzeichen folgt. Z Gilt nur am Ende des Strings. B Wortgrenze. Dies ist eine Behauptung von null Breiten, die nur am Anfang oder Ende eines Wortes passt. Ein Wort wird als eine Folge von alphanumerischen Zeichen definiert, so dass das Ende eines Wortes durch Leerzeichen oder ein nicht-alphanumerisches Zeichen angezeigt wird. Das folgende Beispiel stimmt mit der Klasse überein, wenn es ein komplettes Wort ist, das es in einem anderen Wort enthält. Es gibt zwei Feinheiten, die Sie bei der Verwendung dieser speziellen Sequenz beachten sollten. Erstens, dies ist die schlimmste Kollision zwischen Python8217s String-Literale und reguläre Ausdrücke Sequenzen. In Python8217s String-Literalen ist b das Backspace-Zeichen, ASCII-Wert 8. Wenn you8217re keine rohen Strings verwendet, konvertiert Python das b in einen Backspace und Ihr RE won8217t übereinstimmen, wie Sie es erwarten. Das folgende Beispiel sieht genauso aus wie das vorherige RE, aber das r vor der RE-Zeichenfolge wird weggelassen. Zweitens, innerhalb einer Zeichenklasse, wo there8217s keine Verwendung für diese Behauptung, b repräsentiert das Backspace-Zeichen, für die Kompatibilität mit Python8217s String-Literalen. B Eine weitere Null-Breite-Aussage, dies ist das Gegenteil von b. Wenn die aktuelle Position nicht an einer Wortgrenze liegt. Häufig müssen Sie mehr Informationen zu erhalten, als nur, ob die RE übereinstimmen oder nicht. Reguläre Ausdrücke werden häufig verwendet, um Zeichenfolgen zu sezieren, indem sie ein RE schreiben, das in mehrere Untergruppen unterteilt ist, die mit verschiedenen interessierenden Komponenten übereinstimmen. Beispielsweise wird eine RFC-822-Kopfzeile in einen Header-Namen und einen Wert aufgeteilt, getrennt durch:. Wie folgt: Dies kann durch das Schreiben eines regulären Ausdrucks gehandhabt werden, der mit einer ganzen Kopfzeile übereinstimmt und eine Gruppe hat, die mit dem Header-Namen übereinstimmt, und eine andere Gruppe, die dem header8217s-Wert entspricht. Gruppen werden durch die (.) - Metazeichen markiert. (Und) die gleiche Bedeutung haben wie in mathematischen Ausdrücken, so gruppieren sie die darin enthaltenen Ausdrücke und können den Inhalt einer Gruppe mit einem sich wiederholenden Qualifikationszeichen wiederholen, wie z. . oder . Zum Beispiel wird (ab) mit null oder mehr Wiederholungen von ab übereinstimmen. Gruppen, die mit (.) Gekennzeichnet sind, erfassen auch den Anfangs - und Endindex des Textes, den sie übereinstimmen, indem sie ein Argument an group () übergeben. Anfang(). Ende(). Und span (). Gruppen sind nummeriert, beginnend mit 0. Gruppe 0 ist immer vorhanden it8217s die ganze RE, so Match-Objektmethoden haben alle Gruppe 0 als ihr Standard-Argument. Später we8217ll sehen, wie Gruppen auszudrücken, dass don8217t erfassen die Spannweite des Textes, dass sie übereinstimmen. Untergruppen sind von links nach rechts, von 1 nach oben nummeriert. Gruppen können verschachtelt werden, um die Zahl zu bestimmen, zählen Sie einfach die öffnenden Klammerzeichen, von links nach rechts. Group () können mehrere Gruppennummern gleichzeitig übergeben werden. In diesem Fall wird ein Tupel zurückgegeben, das die entsprechenden Werte für diese Gruppen enthält. Die group () - Methode gibt ein Tupel zurück, das die Zeichenketten für alle Untergruppen enthält, von 1 bis zu vielen, die es gibt. Rückreferenzen in einem Muster können Sie festlegen, dass der Inhalt einer früheren Erfassungsgruppe auch an der aktuellen Position im String gefunden werden muss. Zum Beispiel wird 1 erfolgreich sein, wenn der genaue Inhalt der Gruppe 1 an der aktuellen Position gefunden werden kann, und ansonsten fehlschlägt. Beachten Sie, dass Python8217s String-Literale auch einen Backslash verwenden, gefolgt von Zahlen, um beliebige Zeichen in einen String zu integrieren. Daher sollten Sie unbedingt einen Raw-String verwenden, wenn Sie Rückreferenzen in einem RE integrieren. Beispielsweise erkennt das folgende RE doppelte Wörter in einem String. Backreferenzen wie diese aren8217t oft nützlich für nur durch eine Zeichenfolge 8212 suchen gibt es wenige Textformate, die Daten auf diese Weise 8212 wiederholen, aber you8217ll bald herauszufinden, dass they8217re sehr nützlich, wenn die Durchführung von Strang-Substitutionen. Non-Capture und Named Groups Aufwendige REs können viele Gruppen verwenden, um sowohl Teilstrings von Interesse zu erfassen, als auch die RE selbst zu gruppieren und zu strukturieren. In komplexen REs wird es schwierig, die Gruppennummern zu verfolgen. Es gibt zwei Funktionen, die mit diesem Problem helfen. Beide verwenden eine gemeinsame Syntax für reguläre Ausdrücke, so dass wir dies zuerst sehen. Perl 5 hat zusätzliche reguläre Ausdrücke hinzugefügt, und das Python re Modul unterstützt die meisten von ihnen. Es wäre schwierig gewesen, neue Single-Keystroke-Metazeichen oder neue spezielle Sequenzen auszuwählen, die mit der Darstellung der neuen Features beginnen, ohne dass Perl8217s reguläre Ausdrücke verwirrend von Standard-REs unterscheiden. Wenn Sie Amp als neues Metazeichen wählen, würden zum Beispiel alte Ausdrücke davon ausgehen, dass der Verstärker ein regulärer Charakter war und es nicht durch Schreiben von Amp oder Amp gegeben hätte. Die von den Perl-Entwicklern gewählte Lösung war die Verwendung von (.) Als Erweiterungssyntax. Unmittelbar nachdem eine Klammer ein Syntaxfehler war, weil die. Hätte nichts zu wiederholen, so dass dieses didn8217t keine Kompatibilitätsprobleme einzuführen. Die Zeichen unmittelbar nach der. (Foo) ist eine Sache (eine positive Vorausschau-Behauptung) und (: foo) ist etwas anderes (eine nicht erfassende Gruppe, die den Unterausdruck foo enthält). Python fügt eine Erweiterungssyntax zur Perl8217s-Erweiterungssyntax hinzu. Wenn das erste Zeichen nach dem Fragezeichen ein P. Sie wissen, dass es8217s eine Erweiterung, die spezifisch für Python ist. Derzeit gibt es zwei solche Erweiterungen: (Pltnamegt.) Definiert eine benannte Gruppe und (Pname) ist eine Rückbeziehung zu einer benannten Gruppe. Wenn zukünftige Versionen von Perl 5 ähnliche Funktionen mit einer anderen Syntax hinzufügen, wird das re-Modul geändert, um die neue Syntax zu unterstützen, während die python-spezifische Syntax für compatibility8217s sake bewahrt wird. Nachdem wir nun die allgemeine Syntax der Erweiterung erwähnt haben, können wir auf die Funktionen zurückgreifen, die die Arbeit mit Gruppen in komplexen REs vereinfachen. Da Gruppen von links nach rechts nummeriert werden und ein komplexer Ausdruck viele Gruppen verwenden kann, kann es schwierig werden, die korrekte Nummerierung zu verfolgen. Das Ändern eines solchen komplexen RE ist auch ärgerlich: Fügen Sie eine neue Gruppe in der Nähe des Anfangs ein, und Sie ändern die Nummern von allem, was darauf folgt. Manchmal you8217ll möchten eine Gruppe verwenden, um einen Teil eines regulären Ausdrucks zu sammeln, aber aren8217t interessiert an dem Abrufen der group8217s Inhalte. Sie können diese Tatsache explizit machen, indem Sie eine nicht erfassende Gruppe verwenden: (.). Wo Sie die ersetzen können. Mit jedem anderen regulären Ausdruck. Abgesehen von der Tatsache, dass Sie den Inhalt der Gruppe abrufen können, die mit der Gruppe übereinstimmt, verhält sich eine Nicht-Capturing-Gruppe genauso wie eine Capturing-Gruppe, in die Sie alles hineinlegen können. Wiederholen Sie sie mit einem Wiederholungs-Metazeichen. Und verschachteln Sie es in anderen Gruppen (capturing oder non-capturing). (.) Ist besonders nützlich beim Ändern eines vorhandenen Patterns, da Sie neue Gruppen hinzufügen können, ohne zu ändern, wie alle anderen Gruppen nummeriert sind. Es sollte erwähnt werden, dass es keine Leistungsunterschiede in der Suche zwischen Capturing - und Non-Capturing-Gruppen gibt, weder Form noch schneller als die andere. Ein wichtigeres Merkmal ist Gruppen genannt: Anstatt sich auf sie durch Zahlen zu beziehen, können Gruppen durch einen Namen referenziert werden. Die Syntax für eine benannte Gruppe ist eine der Python-spezifischen Erweiterungen: (Pltnamegt.). Name ist natürlich der Name der Gruppe. Benannte Gruppen verhalten sich genauso wie Capturing-Gruppen und verknüpfen zusätzlich einen Namen mit einer Gruppe. Die Match-Objektmethoden, die mit Capture-Gruppen umgehen, akzeptieren entweder ganze Zahlen, die sich auf die Gruppe nach Anzahl oder Zeichenfolgen beziehen, die den gewünschten group8217s-Namen enthalten. Named Gruppen sind immer noch Zahlen, so können Sie Informationen über eine Gruppe auf zwei Arten abrufen: Named Gruppen sind praktisch, weil sie Sie leicht-erinnern Namen verwenden können, anstatt Zahlen zu merken. Hier8217s ein Beispiel RE aus dem imaplib-Modul: It8217s offensichtlich viel einfacher, m. group (zonem) abzurufen. Anstatt sich daran zu erinnern, die Gruppe 9 abzurufen. Die Syntax für Rückreferenzen in einem Ausdruck wie (.) 1 bezieht sich auf die Nummer der Gruppe. There8217s natürlich eine Variante, die den Gruppennamen anstelle der Zahl verwendet. Dies ist eine weitere Python-Erweiterung: (Pname) gibt an, dass der Inhalt der Gruppe namens name wieder an dem aktuellen Punkt angepasst werden soll. Der reguläre Ausdruck für die Suche nach verdoppelten Wörtern (bw) s1 kann auch als (Plwordgtbw) s (Pword) geschrieben werden: Lookahead-Assertions Eine weitere Assertion der Nullebene ist die Vorausschau-Assertion. Lookahead-Behauptungen sind sowohl in positiver als auch in negativer Form verfügbar und sehen folgendermaßen aus: (.) Positive Aussichten. Dies gelingt, wenn der enthaltene reguläre Ausdruck, hier dargestellt durch. Erfolgreich an der aktuellen Position übereinstimmt, und ansonsten fehlschlägt. Aber sobald der enthaltene Ausdruck ausprobiert worden ist, wird die passende Engine nicht allmählich den Rest des Musters voranbringen, wo die Assertion gestartet wird. (.) Negative Vorausschau. Dies ist das Gegenteil der positiven Assertion, die es erfolgreich gelingt, wenn der enthaltene Ausdruck doesn8217t an der aktuellen Position in der Zeichenfolge übereinstimmt. Um diese konkrete, let8217s Blick auf einen Fall, wo ein lookahead nützlich ist. Betrachten Sie ein einfaches Muster, das mit einem Dateinamen übereinstimmt, und teilen Sie es auseinander in einen Basisnamen und eine Erweiterung, getrennt durch einen. Zum Beispiel in news. rc. News ist der Basisname, und rc ist die Dateiname8217s-Erweiterung. Das dazu passende Muster ist ganz einfach: Beachten Sie, dass die. Muss speziell behandelt werden, weil es eine Metazeichen I8217ve legte es in eine Charakterklasse. Beachten Sie auch, dass das Hinzufügen hinzugefügt wird, um sicherzustellen, dass der gesamte String in der Erweiterung enthalten sein muss. This regular expression matches foo. bar and autoexec. bat and sendmail. cf and printers. conf . Now, consider complicating the problem a bit what if you want to match filenames where the extension is not bat. Some incorrect attempts:.b. The first attempt above tries to exclude bat by requiring that the first character of the extension is not a b. This is wrong, because the pattern also doesn8217t match foo. bar . The expression gets messier when you try to patch up the first solution by requiring one of the following cases to match: the first character of the extension isn8217t b the second character isn8217t a or the third character isn8217t t. This accepts foo. bar and rejects autoexec. bat. but it requires a three-letter extension and won8217t accept a filename with a two-letter extension such as sendmail. cf. We8217ll complicate the pattern again in an effort to fix it. In the third attempt, the second and third letters are all made optional in order to allow matching extensions shorter than three characters, such as sendmail. cf . The pattern8217s getting really complicated now, which makes it hard to read and understand. Worse, if the problem changes and you want to exclude both bat and exe as extensions, the pattern would get even more complicated and confusing. A negative lookahead cuts through all this confusion: .(bat). The negative lookahead means: if the expression bat doesn8217t match at this point, try the rest of the pattern if bat does match, the whole pattern will fail. The trailing is required to ensure that something like sample. batch. where the extension only starts with bat. will be allowed. The . makes sure that the pattern works when there are multiple dots in the filename. Excluding another filename extension is now easy simply add it as an alternative inside the assertion. The following pattern excludes filenames that end in either bat or exe : Modifying Strings Up to this point, we8217ve simply performed searches against a static string. Regular expressions are also commonly used to modify strings in various ways, using the following pattern methods: Splitting Strings The split() method of a pattern splits a string apart wherever the RE matches, returning a list of the pieces. It8217s similar to the split() method of strings but provides much more generality in the delimiters that you can split by split() only supports splitting by whitespace or by a fixed string. As you8217d expect, there8217s a module-level re. split() function, too. Split string by the matches of the regular expression. If capturing parentheses are used in the RE, then their contents will also be returned as part of the resulting list. If maxsplit is nonzero, at most maxsplit splits are performed. You can limit the number of splits made, by passing a value for maxsplit . When maxsplit is nonzero, at most maxsplit splits will be made, and the remainder of the string is returned as the final element of the list. In the following example, the delimiter is any sequence of non-alphanumeric characters. Sometimes you8217re not only interested in what the text between delimiters is, but also need to know what the delimiter was. If capturing parentheses are used in the RE, then their values are also returned as part of the list. Compare the following calls: The module-level function re. split() adds the RE to be used as the first argument, but is otherwise the same. Search and Replace Another common task is to find all the matches for a pattern, and replace them with a different string. The sub() method takes a replacement value, which can be either a string or a function, and the string to be processed. Returns the string obtained by replacing the leftmost non-overlapping occurrences of the RE in string by the replacement replacement . If the pattern isn8217t found, string is returned unchanged. The optional argument count is the maximum number of pattern occurrences to be replaced count must be a non-negative integer. The default value of 0 means to replace all occurrences. Here8217s a simple example of using the sub() method. It replaces colour names with the word colour : The subn() method does the same work, but returns a 2-tuple containing the new string value and the number of replacements that were performed: Empty matches are replaced only when they8217re not adjacent to a previous match. If replacement is a string, any backslash escapes in it are processed. That is, n is converted to a single newline character, r is converted to a carriage return, and so forth. Unknown escapes such as j are left alone. Backreferences, such as 6. are replaced with the substring matched by the corresponding group in the RE. This lets you incorporate portions of the original text in the resulting replacement string. This example matches the word section followed by a string enclosed in . and changes section to subsection : There8217s also a syntax for referring to named groups as defined by the (Pltnamegt. ) syntax. gltnamegt will use the substring matched by the group named name. and gltnumbergt uses the corresponding group number. glt2gt is therefore equivalent to 2. but isn8217t ambiguous in a replacement string such as glt2gt0. ( 20 would be interpreted as a reference to group 20, not a reference to group 2 followed by the literal character 0 .) The following substitutions are all equivalent, but use all three variations of the replacement string. replacement can also be a function, which gives you even more control. If replacement is a function, the function is called for every non-overlapping occurrence of pattern . On each call, the function is passed a match object argument for the match and can use this information to compute the desired replacement string and return it. In the following example, the replacement function translates decimals into hexadecimal: When using the module-level re. sub() function, the pattern is passed as the first argument. The pattern may be provided as an object or as a string if you need to specify regular expression flags, you must either use a pattern object as the first parameter, or use embedded modifiers in the pattern string, e. g. sub(quot(i)bquot, quotxquot, quotbbbb BBBBquot) returns x x . Common Problems Regular expressions are a powerful tool for some applications, but in some ways their behaviour isn8217t intuitive and at times they don8217t behave the way you may expect them to. This section will point out some of the most common pitfalls. Use String Methods Sometimes using the re module is a mistake. If you8217re matching a fixed string, or a single character class, and you8217re not using any re features such as the IGNORECASE flag, then the full power of regular expressions may not be required. Strings have several methods for performing operations with fixed strings and they8217re usually much faster, because the implementation is a single small C loop that8217s been optimized for the purpose, instead of the large, more generalized regular expression engine. One example might be replacing a single fixed string with another one for example, you might replace word with deed. re. sub() seems like the function to use for this, but consider the replace() method. Note that replace() will also replace word inside words, turning swordfish into sdeedfish. but the naive RE word would have done that, too. (To avoid performing the substitution on parts of words, the pattern would have to be bwordb. in order to require that word have a word boundary on either side. This takes the job beyond replace() 8216s abilities.) Another common task is deleting every occurrence of a single character from a string or replacing it with another single character. You might do this with something like re. sub(n, , S). but translate() is capable of doing both tasks and will be faster than any regular expression operation can be. In short, before turning to the re module, consider whether your problem can be solved with a faster and simpler string method. match() versus search() The match() function only checks if the RE matches at the beginning of the string while search() will scan forward through the string for a match. It8217s important to keep this distinction in mind. Remember, match() will only report a successful match which will start at 0 if the match wouldn8217t start at zero, match() will not report it. On the other hand, search() will scan forward through the string, reporting the first match it finds. Sometimes you8217ll be tempted to keep using re. match(). and just add . to the front of your RE. Resist this temptation and use re. search() instead. The regular expression compiler does some analysis of REs in order to speed up the process of looking for a match. One such analysis figures out what the first character of a match must be for example, a pattern starting with Crow must match starting with a C. The analysis lets the engine quickly scan through the string looking for the starting character, only trying the full match if a C is found. Adding . defeats this optimization, requiring scanning to the end of the string and then backtracking to find a match for the rest of the RE. Use re. search() instead. Greedy versus Non-Greedy When repeating a regular expression, as in a. the resulting action is to consume as much of the pattern as possible. This fact often bites you when you8217re trying to match a pair of balanced delimiters, such as the angle brackets surrounding an HTML tag. The naive pattern for matching a single HTML tag doesn8217t work because of the greedy nature of . . The RE matches the lt in lthtmlgt. and the . consumes the rest of the string. There8217s still more left in the RE, though, and the gt can8217t match at the end of the string, so the regular expression engine has to backtrack character by character until it finds a match for the gt. The final match extends from the lt in lthtmlgt to the gt in lttitlegt. which isn8217t what you want. In this case, the solution is to use the non-greedy qualifiers . . or . which match as little text as possible. In the above example, the gt is tried immediately after the first lt matches, and when it fails, the engine advances a character at a time, retrying the gt at every step. This produces just the right result: (Note that parsing HTML or XML with regular expressions is painful. Quick-and-dirty patterns will handle common cases, but HTML and XML have special cases that will break the obvious regular expression by the time you8217ve written a regular expression that handles all of the possible cases, the patterns will be very complicated. Use an HTML or XML parser module for such tasks.) Using re. VERBOSE By now you8217ve probably noticed that regular expressions are a very compact notation, but they8217re not terribly readable. REs of moderate complexity can become lengthy collections of backslashes, parentheses, and metacharacters, making them difficult to read and understand. For such REs, specifying the re. VERBOSE flag when compiling the regular expression can be helpful, because it allows you to format the regular expression more clearly. The re. VERBOSE flag has several effects. Whitespace in the regular expression that isn8217t inside a character class is ignored. This means that an expression such as dog cat is equivalent to the less readable dogcat. but a b will still match the characters a. B. or a space. In addition, you can also put comments inside a RE comments extend from a character to the next newline. When used with triple-quoted strings, this enables REs to be formatted more neatly: This is far more readable than: Regular expressions are a complicated topic. Did this document help you understand them Were there parts that were unclear, or Problems you encountered that weren8217t covered here If so, please send suggestions for improvements to the author. The most complete book on regular expressions is almost certainly Jeffrey Friedl8217s Mastering Regular Expressions, published by O8217Reilly. Unfortunately, it exclusively concentrates on Perl and Java8217s flavours of regular expressions, and doesn8217t contain any Python material at all, so it won8217t be useful as a reference for programming in Python. (The first edition covered Python8217s now-removed regex module, which won8217t help you much.) Consider checking it out from your library. Introduced in Python 2.2.2.
Comments
Post a Comment