Rheinwerk Computing < openbook >

 
Inhaltsverzeichnis
1 Einleitung
2 Die Programmiersprache Python
Teil I Einstieg in Python
3 Erste Schritte im interaktiven Modus
4 Der Weg zum ersten Programm
5 Kontrollstrukturen
6 Dateien
7 Das Laufzeitmodell
8 Funktionen, Methoden und Attribute
9 Informationsquellen zu Python
Teil II Datentypen
10 Das Nichts – NoneType
11 Operatoren
12 Numerische Datentypen
13 Sequenzielle Datentypen
14 Zuordnungen
15 Mengen
16 Collections
17 Datum und Zeit
18 Aufzählungstypen – Enum
Teil III Fortgeschrittene Programmiertechniken
19 Funktionen
20 Modularisierung
21 Objektorientierung
22 Ausnahmebehandlung
23 Iteratoren
24 Kontextobjekte
25 Manipulation von Funktionen und Methoden
Teil IV Die Standardbibliothek
26 Mathematik
27 Kryptografie
28 Reguläre Ausdrücke
29 Schnittstelle zu Betriebssystem und Laufzeitumgebung
30 Kommandozeilenparameter
31 Dateisystem
32 Parallele Programmierung
33 Datenspeicherung
34 Netzwerkkommunikation
35 Debugging und Qualitätssicherung
36 Dokumentation
Teil V Weiterführende Themen
37 Anbindung an andere Programmiersprachen
38 Distribution von Python-Projekten
39 Grafische Benutzeroberflächen
40 Python als serverseitige Programmiersprache im WWW – ein Einstieg in Django
41 Wissenschaftliches Rechnen
42 Insiderwissen
43 Von Python 2 nach Python 3
A Anhang
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 464 KB

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Python 3 von Johannes Ernesti, Peter Kaiser
Das umfassende Handbuch
Buch: Python 3

Python 3
Pfeil 28 Reguläre Ausdrücke
Pfeil 28.1 Syntax regulärer Ausdrücke
Pfeil 28.1.1 Beliebige Zeichen
Pfeil 28.1.2 Zeichenklassen
Pfeil 28.1.3 Quantoren
Pfeil 28.1.4 Vordefinierte Zeichenklassen
Pfeil 28.1.5 Weitere Sonderzeichen
Pfeil 28.1.6 Genügsame Quantoren
Pfeil 28.1.7 Gruppen
Pfeil 28.1.8 Alternativen
Pfeil 28.1.9 Extensions
Pfeil 28.2 Verwendung des Moduls
Pfeil 28.2.1 Searching
Pfeil 28.2.2 Matching
Pfeil 28.2.3 Einen String aufspalten
Pfeil 28.2.4 Teile eines Strings ersetzen
Pfeil 28.2.5 Problematische Zeichen ersetzen
Pfeil 28.2.6 Einen regulären Ausdruck kompilieren
Pfeil 28.2.7 Flags
Pfeil 28.2.8 Das Match-Objekt
Pfeil 28.3 Ein einfaches Beispielprogramm – Searching
Pfeil 28.4 Ein komplexeres Beispielprogramm – Matching
 
Zum Seitenanfang

28    Reguläre Ausdrücke Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

28.1    Syntax regulärer Ausdrücke Zur vorigen ÜberschriftZur nächsten Überschrift

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"
 
Zum Seitenanfang

28.1.1    Beliebige Zeichen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

28.1.2    Zeichenklassen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

28.1.3    Quantoren Zur vorigen ÜberschriftZur nächsten Überschrift

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".
 
Zum Seitenanfang

28.1.4    Vordefinierte Zeichenklassen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

Zeichenklasse Bedeutung
\d Passt auf alle Ziffern des Dezimalsystems.
Ist äquivalent zu [0-9].
\D Passt auf alle Zeichen, die nicht Ziffern des Dezimalsystems sind.
Ist äquivalent zu [^0-9].
\s Passt auf alle Whitespace-Zeichen.
Ist äquivalent zu [ \t\n\r\f\v].
\S Passt auf alle Zeichen, die kein Whitespace sind.
Ist äquivalent zu [^ \t\n\r\f\v].
\w Passt auf alle alphanumerischen Zeichen und den Unterstrich.
Ist äquivalent zu [a-zA-Z0-9_].
\W Passt auf alle Zeichen, die nicht alphanumerisch und kein Unterstrich sind.
Ist äquivalent zu [^a-zA-Z0-9_].

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*".

 
Zum Seitenanfang

28.1.5    Weitere Sonderzeichen Zur vorigen ÜberschriftZur nächsten Überschrift

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".

 
Zum Seitenanfang

28.1.6    Genügsame Quantoren Zur vorigen ÜberschriftZur nächsten Überschrift

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 {}.

 
Zum Seitenanfang

28.1.7    Gruppen Zur vorigen ÜberschriftZur nächsten Überschrift

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:
    r"( ?Python)+ ist gut"
    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".
    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".
 
Zum Seitenanfang

28.1.8    Alternativen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

28.1.9    Extensions Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Python 3 Python 3
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: Einstieg in Python
Einstieg in Python


Zum Rheinwerk-Shop: Python. Der Grundkurs
Python. Der Grundkurs


Zum Rheinwerk-Shop: Algorithmen mit Python
Algorithmen mit Python


Zum Rheinwerk-Shop: Objektorientierte Programmierung
Objektorientierte Programmierung


Zum Rheinwerk-Shop: Raspberry Pi. Das umfassende Handbuch
Raspberry Pi. Das umfassende Handbuch


Zum Rheinwerk-Shop: Roboter-Autos mit dem Raspberry Pi
Roboter-Autos mit dem Raspberry Pi


Zum Rheinwerk-Shop: Neuronale Netze programmieren mit Python
Neuronale Netze programmieren mit Python


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern