28 Reguläre Ausdrücke 

Das Modul re der Standardbibliothek bietet umfangreiche Möglichkeiten zur Arbeit mit regulären Ausdrücken (engl. regular expressions). In einem solchen regulären Ausdruck wird durch eine spezielle Syntax ein Textmuster beschrieben, das dann auf verschiedene Texte oder Textfragmente angewendet werden kann. Grundsätzlich gibt es zwei große Anwendungsbereiche von regulären Ausdrücken.
- Beim Matching wird geprüft, ob ein Textabschnitt auf das Muster des regulären Ausdrucks passt oder nicht. Ein Beispiel für Matching ist ein Test, ob eine eingegebene E-Mail-Adresse syntaktisch gültig ist.
- Die zweite Einsatzmöglichkeit regulärer Ausdrücke ist das Searching, bei dem innerhalb eines größeren Textes nach Textfragmenten gesucht wird, die auf einen regulären Ausdruck passen.
Beim Searching handelt es sich um eine eigene Disziplin, da dieses Verhalten vom Programmierer selbst nicht effizient durch Einsatz des Matchings implementiert werden kann. Ein Anwendungsbeispiel ist der Syntax Highlighter Ihrer Python-Umgebung, der durch Searching nach speziellen Code-Abschnitten wie Schlüsselwörtern oder Strings sucht, um diese grafisch hervorzuheben.
Ein regulärer Ausdruck ist in Python ein String, der die entsprechenden Regeln enthält. Im Gegensatz zu manch anderen Programmiersprachen existiert hier kein eigenes Literal zu diesem Zweck.
Im Folgenden möchten wir Ihnen die Syntax regulärer Ausdrücke vorstellen. Allein zu diesem Thema sind bereits ganze Bücher erschienen, weswegen die Beschreibung hier vergleichsweise knapp, aber grundlegend ausfällt. Es gibt verschiedene Notationen zur Beschreibung regulärer Ausdrücke. Python hält sich an die Syntax, die in der Programmiersprache Perl verwendet wird.
28.1 Syntax regulärer Ausdrücke 

Grundsätzlich ist der String "python" bereits ein regulärer Ausdruck, der exakt auf den String "python" passt. Direkt angegebene einzelne Buchstaben werden Zeichenliterale genannt. Zeichenliterale innerhalb regulärer Ausdrücke sind case sensitive, das heißt, dass der obige Ausdruck nicht auf den String "Python" passen würde.
In regulären Ausdrücken kann eine Reihe von Steuerungszeichen verwendet werden, die den Ausdruck flexibler und mächtiger machen. Diese werden im Folgenden besprochen.
[»] Hinweis
Sollten Sie sich mit regulären Ausdrücken bereits auskennen, sind Sie vielleicht gerade auf ein Problem aufmerksam geworden, denn der Backslash ist ein wichtiges Zeichen zur Beschreibung regulärer Ausdrücke, und ausgerechnet dieses Zeichen trägt innerhalb eines Strings bereits eine Bedeutung: Normalerweise leitet ein Backslash eine Escape-Sequenz ein. Sie können nun entweder immer die Escape-Sequenz für einen Backslash ("\\") verwenden oder auf Pythons Raw-Strings zurückgreifen, die durch ein vorangestelltes r gekennzeichnet werden:
r"\Hallo Welt"
28.1.1 Beliebige Zeichen 

Die einfachste Verallgemeinerung, die innerhalb eines regulären Ausdrucks verwendet werden kann, ist die Kennzeichnung eines beliebigen Zeichens durch einen Punkt[ 117 ](Hier zeigt sich, dass ein Punkt innerhalb eines regulären Ausdrucks eine spezielle Bedeutung hat. Um das eigentliche Zeichen ».« zu beschreiben, muss ihm im regulären Ausdruck ein Backslash vorangestellt werden: r"P\.thon" passt nur auf den String "P.thon". Dies gilt analog für andere Sonderzeichen wie beispielsweise Klammern. ). So passt der Ausdruck
r".ython"
sowohl auf "python" und "Python" als auch auf "Jython", nicht jedoch auf "Blython" oder "ython", da es sich um genau ein einzelnes beliebiges Zeichen handelt.
28.1.2 Zeichenklassen 

Abgesehen davon, ein Zeichen ausdrücklich als beliebig zu kennzeichnen, ist es auch möglich, eine Klasse von Zeichen vorzugeben, die an dieser Stelle vorkommen dürfen. Dazu werden die gültigen Zeichen in eckige Klammern an die entsprechende Position geschrieben:
r"[jp]ython"
Dieser reguläre Ausdruck arbeitet ähnlich wie der des letzten Abschnitts, lässt jedoch nur die Buchstaben j und p als erstes Zeichen des Wortes zu. Damit passt der Ausdruck sowohl auf "jython" als auch auf "python", jedoch nicht auf "Python", "jpython" oder "ython". Um auch die jeweiligen Großbuchstaben im Wort zu erlauben, können Sie den Ausdruck folgendermaßen erweitern:
r"[jJpP]ython"
Innerhalb einer Zeichenklasse ist es möglich, ganze Bereiche von Zeichen zuzulassen. Dadurch wird folgende Syntax verwendet:
r"[A-Z]ython"
Dieser reguläre Ausdruck lässt jeden Großbuchstaben als Anfangsbuchstaben des Wortes zu, beispielsweise aber keinen Kleinbuchstaben und keine Zahl. Um mehrere Bereiche zuzulassen, schreiben Sie diese einfach hintereinander:
r"[A-Ra-r]ython"
Dieser reguläre Ausdruck passt beispielsweise sowohl auf "Qython" als auch auf "qython", nicht aber auf "Sython" oder "3ython".
Auch Ziffernbereiche können als Zeichenklasse verwendet werden:
r"[0-9]ython"
Als letzte Möglichkeit, die eine Zeichengruppe bietet, können Zeichen oder Zeichenbereiche ausgeschlossen werden. Dazu wird zu Beginn der Zeichengruppe ein Zirkumflex (^) geschrieben. So erlaubt der reguläre Ausdruck
r"[^pP]ython"
jedes Zeichen, abgesehen von einem großen oder kleinen »P«. Demzufolge passen sowohl "Sython" als auch "wython", während "Python" und "python" außen vor bleiben.
Beachten Sie, dass es innerhalb einer Zeichenklasse, abgesehen vom Bindestrich und dem Zirkumflex, keine Zeichen mit spezieller Bedeutung gibt. Das heißt insbesondere, dass ein Punkt in einer Zeichenklasse tatsächlich das Zeichen ».« beschreibt und nicht etwa ein beliebiges Zeichen.
28.1.3 Quantoren 

Bisher können wir in einem regulären Ausdruck bestimmte Regeln für einzelne Zeichen aufstellen. Wir stehen allerdings vor einem Problem, wenn wir an einer bestimmten Stelle des Wortes eine gewisse Anzahl oder gar beliebig viele dieser Zeichen erlauben möchten. Für diesen Zweck werden Quantoren eingesetzt. Das sind spezielle Zeichen, die hinter ein einzelnes Zeichenliteral oder eine Zeichenklasse geschrieben werden und kennzeichnen, wie oft diese auftreten dürfen. Tabelle 28.1 listet alle Quantoren auf und erläutert kurz ihre Bedeutung. Danach werden wir Beispiele für die Verwendung von Quantoren bringen.
Quantor | Bedeutung |
---|---|
? | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse darf entweder keinmal oder einmal vorkommen. |
* | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse darf beliebig oft hintereinander vorkommen, das heißt unter anderem, dass sie auch weggelassen werden kann. |
+ | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse darf beliebig oft hintereinander vorkommen, mindestens aber einmal. Sie darf also nicht weggelassen werden. |
Tabelle 28.1 Quantoren in regulären Ausdrücken
Die folgenden drei Beispiele zeigen einen regulären Ausdruck mit je einem Quantor.
-
r"P[Yy]?thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes ein höchstens einmaliges Auftreten des großen oder kleinen »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Python" und "Pthon", jedoch nicht auf "Pyython". -
r"P[Yy]*thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes ein beliebig häufiges Auftreten des großen oder kleinen »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Python", "Pthon" und "PyyYYYyython", jedoch nicht auf "Pzthon". -
r"P[Yy]+thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes ein mindestens einmaliges Auftreten des großen oder kleinen »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Python", "PYthon" und "PyyYYYyython", jedoch nicht auf "Pthon".
Neben den Quantoren gibt es eine Syntax, die es ermöglicht, exakt anzugeben, wie viele Wiederholungen einer Zeichengruppe erlaubt sind. Dabei werden die Unter- und Obergrenzen für Wiederholungen in geschweifte Klammern hinter das entsprechende Zeichen bzw. die entsprechende Zeichengruppe geschrieben. Tabelle 28.2 listet die Möglichkeiten der Notation auf.
Syntax | Bedeutung |
---|---|
{anz} | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse muss exakt anz-mal vorkommen. |
{min,} | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse muss mindestens min-mal vorkommen. |
{,max} | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse darf maximal max-mal vorkommen. |
{min,max} | Das vorangegangene Zeichen bzw. die vorangegangene Zeichenklasse muss mindestens min-mal und darf maximal max-mal vorkommen. |
Tabelle 28.2 Wiederholungen in regulären Ausdrücken
Auch für diese Quantoren ändern wir das bisherige Beispiel ab und untersuchen ihre Auswirkungen.
-
r"P[Yy]{2}thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes exakt zwei jeweils große oder kleine »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Pyython" oder "PYython", jedoch nicht auf "Pyyython". -
r"P[Yy]{2,}thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes mindestens zwei jeweils große oder kleine »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Pyython", "PYython" und "PyyYYYyython", jedoch nicht auf "Python". -
r"P[Yy]{,2}thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes maximal zwei jeweils große oder kleine »Y«. Damit passt der Ausdruck beispielsweise auf die Wörter "Python", "Pthon" und "PYYthon", jedoch nicht auf "Pyyython". -
r"P[Yy]{1,2}thon"
Dieser reguläre Ausdruck erwartet an der zweiten Stelle des Wortes mindestens ein und maximal zwei große oder kleine »Y«. Damit passt der Ausdruck z. B. auf die Wörter "Python" oder "PYython", jedoch nicht auf "Pthon" oder "PYYYthon".
28.1.4 Vordefinierte Zeichenklassen 

Damit Sie nicht bei jedem regulären Ausdruck das Rad neu erfinden müssen, existiert eine Reihe vordefinierter Zeichenklassen, die beispielsweise alle Ziffern oder alle alphanumerischen Zeichen umfassen. Diese Zeichenklassen werden bei der Arbeit mit regulären Ausdrücken häufig benötigt und können deswegen durch einen speziellen Code abgekürzt werden. Jeder dieser Codes beginnt mit einem Backslash. Tabelle 28.3 listet alle vordefinierten Zeichenklassen mit ihren Bedeutungen auf.
Tabelle 28.3 Vordefinierte Zeichenklassen in regulären Ausdrücken
[»] Hinweis
Operationen mit regulären Ausdrücken können in zwei Modi durchgeführt werden, die anhand des Typs[ 118 ](Einen alternativen Weg bietet das ASCII-Flag, das Sie in Abschnitt 28.2.7, »Flags«, finden. ) des regulären Ausdrucks unterschieden werden:
- Ist der reguläre Ausdruck ein bytes-String, werden die Operationen im ASCII-Zeichenraum durchgeführt.
- Ist der reguläre Ausdruck ein String, werden die Operationen im Unicode-Zeichenraum durchgeführt.
Die in der obigen Tabelle angegebenen Äquivalenzklassen erweitern sich im Falle eines Unicode-Ausdrucks analog. So zählen die deutschen Umlaute in diesem Fall beispielsweise zu den alphanumerischen Zeichen.
Die vordefinierten Zeichenklassen können wie ein normales Zeichen im regulären Ausdruck verwendet werden. So passt der Ausdruck
r"P\w*th\dn"
auf die Wörter "Pyth0n" oder "P_th1n", beispielsweise jedoch nicht auf "Python".
Beachten Sie, dass die üblichen Escape-Sequenzen, die innerhalb eines Strings verwendet werden können, auch innerhalb eines regulären Ausdrucks – selbst wenn er in einem Raw-String geschrieben wird – ihre Bedeutung behalten und nicht mit den hier vorgestellten Zeichenklassen interferieren. Gebräuchlich sind hier vor allem \n, \t, \r oder \\, insbesondere aber auch \x.[ 119 ](Erklärungen der Escape-Sequenzen finden Sie in den Abschnitt 13.4.1, »Steuerzeichen«, und Abschnitt 13.4.4, »Zeichensätze und Sonderzeichen«. )
Zudem ist es mit dem Backslash möglich, einem Sonderzeichen die spezielle Bedeutung zu nehmen, die es innerhalb eines regulären Ausdrucks trägt. Auf diese Weise können Sie zum Beispiel mit den Zeichen »*« oder »+« arbeiten, ohne dass diese als Quantoren angesehen werden. So passt der folgende reguläre Ausdruck
r"\*Py\.\.\.on\*"
allein auf den String "*Py...on*".
28.1.5 Weitere Sonderzeichen 

Manchmal müssen Regeln aufgestellt werden, die über die bloße Zeichenebene hinausgehen. So ist es beispielsweise interessant, einen regulären Ausdruck zu erschaffen, der nur passt, wenn sich das Wort am Anfang oder Ende einer Textzeile befindet. Für solche und ähnliche Fälle gibt es einen Satz an Sonderzeichen, die genauso angewendet werden wie die vordefinierten Zeichenklassen. Tabelle 28.4 listet alle zusätzlichen Sonderzeichen auf und gibt zu jedem eine kurze Erklärung.
Sonderzeichen | Bedeutung |
---|---|
\A | Passt nur am Anfang eines Strings. |
\b | Passt nur am Anfang oder Ende eines Wortes. Ein Wort kann aus allen Zeichen der Klasse \w bestehen und wird durch ein Zeichen der Klasse \s begrenzt. |
\B | Passt nur, wenn es sich nicht um den Anfang oder das Ende eines Wortes handelt. |
\Z | Passt nur am Ende eines Strings. |
^ |
Passt nur am Anfang eines Strings. Wenn das MULTILINE-Flag gesetzt wurde, passt ^ auch direkt nach jedem Newline-Zeichen innerhalb des Strings.* |
$ |
Passt nur am Ende eines Strings. Wenn das MULTILINE-Flag gesetzt wurde, passt $ auch direkt vor jedem Newline-Zeichen innerhalb des Strings.* |
* Näheres zum MULTILINE-Flag erfahren Sie in Abschnitt 28.2.7, »Flags«. |
Tabelle 28.4 Sonderzeichen in regulären Ausdrücken
Im konkreten Beispiel passt also der reguläre Ausdruck r"Python\Z" nur bei dem String "Python", nicht jedoch bei "Python rockt".
28.1.6 Genügsame Quantoren 

Wir haben bereits die Quantoren ?, * und + besprochen. Diese werden in der Terminologie regulärer Ausdrücke als »gefräßig« (engl. greedy) bezeichnet. Diese Klassifizierung ist besonders beim Searching von Bedeutung. Betrachten Sie dazu einmal folgenden regulären Ausdruck:
r"Py.*on"
Dieser Ausdruck passt auf jeden Teil-String, der mit Py beginnt und mit on endet. Dazwischen können beliebig viele, nicht näher spezifizierte Zeichen stehen. Behalten Sie im Hinterkopf, dass wir uns beim Searching befinden, der Ausdruck also dazu verwendet werden soll, aus einem längeren String verschiedene Teil-Strings zu isolieren, die auf den regulären Ausdruck passen.
Nun möchten wir den regulären Ausdruck gedanklich auf den folgenden String anwenden:
"Python Python Python"
Sie meinen, dass drei Ergebnisse gefunden werden? Irrtum, es handelt sich um exakt ein Ergebnis, nämlich den Teil-String "Python Python Python". Zur Erklärung: Es wurde der »gefräßige« Quantor * eingesetzt. Ein solcher gefräßiger Quantor hat die Ambition, die maximal mögliche Anzahl Zeichen zu »verschlingen«. Beim Searching wird also, solange die »gefräßigen« Quantoren eingesetzt werden, stets der größtmögliche passende String gefunden.
Dieses Verhalten lässt sich umkehren, sodass immer der kleinstmögliche passende String gefunden wird. Dazu können Sie an jeden Quantor ein Fragezeichen anfügen. Dadurch wird der Quantor »genügsam« (engl. non-greedy). Angenommen, das Searching auf dem oben genannten String wäre mit dem regulären Ausdruck
r"Py.*?on"
durchgeführt worden, wäre als Ergebnis tatsächlich dreimal der Teil-String "Python" gefunden worden. Dies funktioniert für die Quantoren ?, *, + und {}.
28.1.7 Gruppen 

Ein Teil eines regulären Ausdrucks kann durch runde Klammern zu einer Gruppe zusammengefasst werden. Eine solche Gruppierung hat im Wesentlichen drei Vorteile:
-
Eine Gruppe kann als Einheit betrachtet und als solche mit einem Quantor versehen werden. Auf diese Weise lässt sich beispielsweise das mehrmalige Auftreten einer bestimmten Zeichenkette erlauben:
In diesem Ausdruck existiert eine Gruppe um den Teilausdruck r" ?Python". Dieser Teilausdruck passt auf den String "Python" mit einem optionalen Leerzeichen zu Beginn. Die gesamte Gruppe kann nun beliebig oft vorkommen, womit der obige reguläre Ausdruck sowohl auf "Python ist gut" als auch auf "Python Python Python ist gut" passt. Die Gruppe muss aber mindestens einmal auftreten, der Ausdruck passt nicht auf den String " ist gut".
r"( ?Python)+ ist gut"
Beachten Sie das Leerzeichen zu Beginn der Gruppe, um die Funktionsweise des Ausdrucks zu verstehen. -
Der zweite Vorteil einer Gruppe ist, dass Sie auf sie zugreifen können, nachdem das Searching bzw. Matching durchgeführt wurde. Das heißt, Sie könnten beispielsweise überprüfen, ob eine eingegebene URL gültig ist, und gleichzeitig Subdomain, Domain und TLD herausfiltern.
Näheres dazu, wie der Zugriff auf Gruppen funktioniert, erfahren Sie in Abschnitt 28.2, »Verwendung des Moduls«. - Es gibt Gruppen, die in einem regulären Ausdruck häufiger gebraucht werden. Um diese nicht jedes Mal erneut schreiben zu müssen, werden Gruppen, mit 1 beginnend, durchnummeriert und können dann anhand ihres Index referenziert werden. Eine solche Referenz besteht aus einem Backslash, gefolgt von dem Index der jeweiligen Gruppe, und passt auf den gleichen Teil-String, auf den die Gruppe gepasst hat. So passt der reguläre Ausdruck r"(Python) \1" auf "Python Python".
28.1.8 Alternativen 

Eine weitere Möglichkeit, die die Syntax regulärer Ausdrücke vorsieht, sind Alternativen. Im Prinzip handelt es sich dabei um eine ODER-Verknüpfung zweier Zeichen oder Zeichengruppen, wie Sie sie bereits von dem Operator or her kennen. Diese Verknüpfung wird durch den senkrechten Strich |, auch Pipe genannt, durchgeführt.
r"P(ython|eter)"
Dieser reguläre Ausdruck passt sowohl auf den String "Python" als auch auf "Peter". Durch die Gruppe kann später ausgelesen werden, welche der beiden Alternativen aufgetreten ist.
28.1.9 Extensions 

Damit ist die Syntax regulärer Ausdrücke beschrieben. Zusätzlich zu dieser mehr oder weniger standardisierten Syntax erlaubt Python die Verwendung sogenannter Extensions. Eine Extension ist folgendermaßen aufgebaut:
(?...)
Die drei Punkte werden durch eine Kennung der gewünschten Extension und weitere extensionspezifische Angaben ersetzt. Diese Syntax wurde gewählt, da eine öffnende Klammer, gefolgt von einem Fragezeichen, keine syntaktisch sinnvolle Bedeutung hat und demzufolge »frei« war. Beachten Sie aber, dass eine Extension nicht zwingend eine neue Gruppe erzeugt, auch wenn die runden Klammern dies nahelegen. Im Folgenden gehen wir näher auf die Extensions ein, die in Pythons regulären Ausdrücken verwendet werden können.
(?aiLmsux)
Diese Extension erlaubt es, ein oder mehrere Flags für den gesamten regulären Ausdruck zu setzen. Dabei bezeichnet jedes der Zeichen »a«, »i«, »L«, »m«, »s«, »u« und »x« ein bestimmtes Flag. Der Begriff Flag ist bereits verwendet worden und beschreibt eine Einstellung, die entweder aktiviert oder deaktiviert werden kann. Ein Flag kann entweder im regulären Ausdruck selbst, eben durch diese Extension, oder durch einen Parameter der Funktion re.compile (Abschnitt 28.2.6) gesetzt werden. Im Zusammenhang mit dieser Funktion werden wir näher darauf eingehen, welche Flags wofür stehen. Das Flag i macht den regulären Ausdruck beispielsweise case insensitive:
r"(?i)P"
Dieser Ausdruck passt sowohl auf "P" als auch auf "p". Seit Python 3.6 können Flags für einen Teil des regulären Ausdrucks gesetzt oder entfernt werden. Die folgenden beiden regulären Ausdrücke ändern die case sensitivity jeweils für die inneren zwei Buchstaben des Wortes »Python«:
r"Py(?i:th)on"
r"(?i)Py(?-i:th)on"
(?:…)
Diese Extension wird wie normale runde Klammern verwendet, erzeugt dabei aber keine Gruppe. Das heißt, auf einen durch diese Extension eingeklammerten Teilausdruck können Sie später nicht zugreifen. Ansonsten ist diese Syntax äquivalent zu runden Klammern:
r"(?:abc|def)"
Mithilfe dieses Konstrukts lässt sich ein regulärer Ausdruck strukturieren, ohne dass dabei ein Overhead durch die Bildung von Gruppen entsteht.
(?P<name>…)
Diese Extension erzeugt eine Gruppe mit dem angegebenen Namen. Das Besondere an einer solchen benannten Gruppe ist, dass sie nicht allein über ihren Index, sondern auch über ihren Namen referenziert werden kann. Der Name muss ein gültiger Bezeichner sein:
r"(?P<hallowelt>abc|def)"
(?P=name)
Diese Extension passt auf all das, auf das die bereits definierte Gruppe mit dem Namen name gepasst hat. Diese Extension erlaubt es also, eine benannte Gruppe zu referenzieren.
r"(?P<py>[Pp]ython) ist, wie (?P=py) sein sollte"
Dieser reguläre Ausdruck passt auf den String "Python ist, wie Python sein sollte".
(?#...)
Diese Extension stellt einen Kommentar dar. Der Inhalt der Klammern wird schlicht ignoriert:
r"Py(?#lalala)thon"
(?=…)
Diese Extension passt nur dann, wenn der reguläre Ausdruck … als Nächstes passt. Diese Extension greift also vor, ohne in der Auswertung des Ausdrucks tatsächlich voranzuschreiten.
Mit dem regulären Ausdruck r"\w+(?= Meier)" lässt sich beispielsweise nach den Vornamen aller im Text vorkommenden Meiers suchen. Die naheliegende Alternative r"\w+ Meier" würde nicht nur die Vornamen, sondern immer auch den Nachnamen Meier in das Ergebnis mit aufnehmen. Dieses Beispiel können Sie leicht auf die folgenden drei Extensions übertragen, weswegen wir dort auf ein Beispiel verzichten.
(?!…)
Diese Extension passt nur dann, wenn der reguläre Ausdruck … als Nächstes nicht passt. Diese Extension ist das Gegenstück zu der vorherigen.
(?<=…)
Diese Extension passt nur, wenn der reguläre Ausdruck … zuvor gepasst hat. Diese Extension greift also auf bereits ausgewertete Teile des Strings zurück, ohne die Auswertung selbst zurückzuwerfen.
(?<!...)
Diese Extension passt nur, wenn der reguläre Ausdruck … zuvor nicht gepasst hat. Diese Extension ist damit das Gegenstück zu der vorherigen.
(?(id/name)yes-pattern|no-pattern)
Diese kompliziert anmutende Extension kann in einem regulären Ausdruck als Fallunterscheidung verwendet werden. Abhängig davon, ob eine Gruppe mit dem angegebenen Index bzw. dem angegebenen Namen auf einen Teil-String gepasst hat, wird entweder (im positiven Fall) auf das yes-pattern oder (im negativen Fall) auf das no-pattern getestet. Das no-pattern wird durch einen senkrechten Strich vom yes-pattern getrennt, kann aber auch weggelassen werden.
r"(?P<klammer>\()?Python(?(klammer)\))"
In diesem Ausdruck wird zunächst eine Gruppe namens klammer erstellt, die maximal einmal vorkommen darf und aus einer öffnenden runden Klammer besteht. Danach folgt die Zeichenkette Python, und schließlich wird durch die Extension eine schließende Klammer gefordert, sofern zuvor eine öffnende aufgetreten ist, also sofern die Gruppe klammer zuvor gepasst hat.
Damit passt der reguläre Ausdruck auf die Strings "Python" und "(Python)", beispielsweise aber nicht auf "(Python".
Damit wäre den syntaktischen Regeln für reguläre Ausdrücke Genüge getan. Auch wenn dieser Abschnitt möglicherweise etwas trocken und theoretisch war, ist es durchaus wichtig, sich mit regulären Ausdrücken auseinanderzusetzen, denn in vielen Fällen ist ihr Einsatz besonders elegant.
In den folgenden Abschnitten sprechen wir über die praktische Anwendung regulärer Ausdrücke in Python. Dazu gehört zunächst einmal die Verwendung des Moduls re. Danach zeigen wir Ihnen jeweils ein kleines Beispielprojekt zum Matching bzw. Searching.