Python RegEx: So funktionieren reguläre Ausdrücke in der beliebten Programmiersprache

Regular Expressions, kurz RegEx, können in Python nach Importieren des Built-in-Pakets „re“ genutzt werden, um innerhalb von Zeichenketten nach bestimmten Mustern zu suchen.

Was genau ist Python RegEx?

Mit RegEx werden sogenannte reguläre Ausdrücke bezeichnet. Hierbei handelt es sich um Zeichenketten, die spezifische Suchmuster definieren. Sie können genutzt werden, um Python Strings auf ebendiese Suchmuster hin zu prüfen. Python RegEx folgen einer eigenen Syntax und Semantik.

Einsatzgebiete von Python RegEx

Reguläre Ausdrücke werden häufig eingesetzt, um Eingaben von Nutzenden eines Programms auf ein bestimmtes Format hin zu untersuchen.

Ein bekanntes und Ihnen sicher bekanntes Beispiel hierfür ist das Erstellen eines Passworts, das beispielsweise mindestens einen Großbuchstaben und mindestes eine Ziffer enthalten soll. Python RegEx kann nun eingesetzt werden, um Ihre Eingabe auf diese Regeln hin zu überprüfen.

Auch bei der Ausfüllung von Webformularen werden reguläre Ausdrücke häufig eingesetzt, um die Gültigkeit von Nutzereingaben zu überprüfen. So kann beispielsweise ausgewertet werden, ob es sich bei einer eingegebenen E-Mail-Adresse tatsächlich um eine E-Mail-Adresse im gültigen Format handelt.

Tipp

Wenn Sie für ein Webprojekt mit Python arbeiten, werden reguläre Ausdrücke Ihnen an vielen Stellen helfen. Ebenfalls hilfreich ist Deploy Now von IONOS, das es Ihnen ermöglicht, Ihre Webprojekte direkt via GitHub zu builden und zu deployen.

Syntax und Semantik von Python RegEx

Innerhalb von regulären Ausdrücken werden sogenannte Metacharacters eingesetzt. Hierbei handelt es sich um Zeichen, die innerhalb von Python RegEx eine bestimmte Bedeutung haben. Die wichtigsten Metacharacters inklusive ihrer Bedeutung und einem Beispiel finden Sie in folgender Übersichtstabelle:

Zeichen Beschreibung Beispiel
. Steht für jedes beliebige Zeichen außer Newline ha..o -> findet alle Strings, die mit „ha“, gefolgt von zwei beliebigen Zeichen, gefolgt von „o“ enden, z. B. „hallo“
[] Findet alle Buchstaben, die zwischen den Klammern spezifiziert sind [a-e] -> findet alle kleingeschriebenen Buchstaben zwischen a und e
^ Überprüft, ob String mit einem angegebenen Zeichen oder einer angegebenen Zeichenkette beginnt ^hallo -> überprüft, ob String mit „hallo“ beginnt
$ Überprüft, ob String mit einem angegebenen Zeichen oder einer angegebenen Zeichenkette endet $welt -> überprüft, ob String mit „welt“ endet
* Null oder mehrere Vorkommen von einem Zeichen a* -> matcht entweder bei beliebig vielen oder gar keinem a
+ Ein oder mehrere Vorkommen von einem Zeichen a+ -> matcht bei mindestens einem Vorkommen von a
? Ein oder kein Vorkommen von einem Zeichen a? -> matcht bei genau einem oder keinem a
{} Überprüft, ob ein Zeichen genauso oft vorkommt, wie in den geschweiften Klammern spezifiziert hal{2}o -> matcht bei dem String „hallo“

Sets

Besonders wichtig für die meisten Python RegEx sind die sogenannten Sets, auf die sich daher ein genauerer Blick lohnt. Sets sind die RegEx-Muster, die mit einer eckigen Klammer beginnen und enden. Ein Beispiel für ein Set, das alle kleingeschriebenen Buchstaben zwischen a und e findet, haben Sie bereits in der obigen Übersichtstabelle kennengelernt. Nachfolgend finden Sie eine Übersicht über häufige Nutzungsfälle von Sets in Python RegEx:

Set Beschreibung
[abc] Matcht, wenn eines der zwischen den Klammern angegebenen Zeichen (also a, b, oder c) innerhalb einer Zeichenkette vorkommt
[^abc] Matcht für alle Zeichen, die nicht innerhalb der Klammern angegeben wurden
[a-z] Matcht für alle kleingeschriebenen Buchstaben zwischen a und z
[a-zA-Z] Matcht für alle Buchstaben zwischen a und z, egal, ob sie groß- oder kleingeschrieben sind
[0-9] Matcht für jede Zahl zwischen 0 und 9
[1-5][0-9] Matcht für alle zweistelligen Zahlen zwischen 10 und 59

Wie Sie sehen, sind Sets ein mächtiges Mittel für verschiedene reguläre Ausdrücke. Bei der Nutzung von Sets gilt es allerdings zu beachten, dass die oben vorgestellten Metacharacters innerhalb der eckigen Klammern keinerlei spezifische Bedeutung haben. Das Set [*] würde also alle * in einer gegebenen Zeichenkette matchen.

Sequenzen

Neben den vorgestellten Metacharacters können Sie in Python RegEx Gebrauch von speziellen und bereits vordefinierten Sequenzen machen, um präzise Suchmuster zu erstellen.

Sequenz Beschreibung Beispiel
\A Matcht, wenn die spezifizierte Zeichenkette zu Beginn eines Strings zu finden ist \AMontag- Matcht für "Montag ist ein toller Tag."- Matcht nicht für "Es ist Montag."
\b Matcht, wenn die spezifizierte Zeichenkette am Anfang oder am Ende eines Wortes zu finden ist \bes- Matcht für "Montag regnet es."- Matcht für "essen"- Matcht nicht für "Abendessen""es\b"- Matcht für "Wahres"- Matcht für "Ein mutiges Kind"- Matcht nicht für "Rest"
\B Matcht, wenn spezifizierte Zeichenkette nicht am Anfang oder am Ende eines Wortes zu finden ist; Gegenteil von \b \Bes- Matcht nicht für "Montag regnet es."- Matcht nicht für "essen"- Matcht für "Abendessen""es\B"- Matcht nicht für "Wahres"- Matcht nicht für "Ein mutiges Kind"- Matcht für "Rest"
\d Matcht alle Ziffer zwischen 0 und 9; Äquivalent zu [0-9] 123- \d findet drei Matches für 1, 2 und 3
\D Matcht alle Zeichen, die keine Ziffer sind; Äquivalent zu [^0-9] 123acb&- \D findet vier Matches für a, c, b und &
\s Matcht, wenn der String ein Leerzeichen enthält Python RegEx- \s matcht, da es ein Leerzeichen gibt
\S Matcht, wenn der String kein Leerzeichen enthält; Gegenteil von \s Python RegEx- \S matcht nicht, da es ein Leerzeichen gibt
\w Matcht alle alphanumerischen Zeichen 1abc$%3- \w findet vier Matches für 1, a, b, c und 3
\W Matcht für alle Zeichen außer alphanumerischen Zeichen; Gegenteil von \w 1abc$%3- \W findet zwei Matches für $ und %
\Z Matcht, wenn die spezifizierte Zeichenkette am Ende eines Strings ist Python\Z- Matcht für "RegEx in Python"- Matcht nicht für "Python RegEx"

Funktionen für die Nutzung von Python RegEx

Wenn Sie in Python RegEx nutzen möchten, helfen Ihnen eine Reihe vordefinierter Funktionen weiter. All diese Funktionen befinden sich in einem Python-Modul namens „re“, das Sie daher bei der Arbeit mit regulären Ausdrücken zunächst importieren müssen:

import re

re.findall()

Die wohl wichtigste Funktion im Umgang mit Python RegEx ist die Funktion findall(). Sie nimmt ein Suchmuster und einen Python String entgegen und liefert Ihnen eine Python Liste bestehend aus Strings zurück, die alle Matches in der Reihenfolge, in der sie gefunden wurden, beinhaltet. Wenn kein Match gefunden wird, liefert der findall()-Aufruf eine leere Liste.

Zur Veranschaulichung der Funktion hilft ein Codebeispiel:

import re
string = "python 3.0"
regex = "\D"
ergebnis = re.findall(regex, string)
print(ergebnis)

Im obigen Codeschnipsel wird zunächst wie gezeigt das Modul re importiert. In der Variable namens „string“ wird dann die Zeichenkette „python 3.0“ hinterlegt. Das Suchmuster, das in der Variable namens „regex“ gespeichert wird, ist Ihnen aus der Sequenz-Tabelle bereits bekannt und matcht auf alle Zeichen, die keine Ziffer sind. Dieses Matching wird mit der findall()-Funktion realisiert, die als Übergabeparameter das Suchmuster und die zu untersuchende Zeichenkette entgegennimmt. Die Liste, die von der Funktion zurückgegeben wird, wird in der Variable namens „ergebnis“ hinterlegt und mit einem Aufruf von Python print auf dem Bildschirm ausgegeben. Der Output sieht wie folgt aus:

['p', 'y', 't', 'h', 'o', 'n', ' ', '.']

Die Liste beinhaltet jedes Zeichen aus dem String mit Ausnahme der Ziffern. Zu beachten ist, dass auch das Leerzeichen als eigenes Zeichen zählt und somit innerhalb der Liste auftaucht.

re.sub()

Mit der sub()-Funktion werden alle Matches mit einem Text Ihrer Wahl überschrieben. Die Funktion nimmt als ersten Übergabeparameter wie findall() auch einen regulären Ausdruck. Den Text, mit dem Sie die Matches ersetzen möchten, müssen Sie als zweiten Übergabeparameter übergeben. Der dritte Übergabeparameter der Funktion ist der zu durchsuchende String. Wenn Sie nicht alle, sondern nur eine bestimmte Anzahl an Matches überschreiben möchten, können Sie als vierten Übergabeparameter eine Zahl angeben, die angibt, wie viele Matches beginnend bei dem ersten Match ersetzt werden sollen.

Auch hier hilft ein Codebeispiel, um sich die Funktionsweise zu vergegenwärtigen:

import re
string = "python ist eine tolle programmiersprache"
regex = "\s"
ergebnis1 = re.sub(regex, "0", string)
print(ergebnis1)
ergebnis2 = re.sub(regex, "0", string, 2)
print(ergebnis2)

Wieder wird zunächst re importiert und im Anschluss eine Zeichenkette in der Variable „string“ hinterlegt. Das Suchmuster, das angewendet werden soll, kennen Sie ebenfalls bereits: Es matcht auf alle Leerzeichen in einem String.

Anschließend folgen zwei ähnliche Aufrufe von sub(): Der erste Funktionsaufruf soll alle Leerzeichen im übergebenen String mit einer 0 ersetzen und speichert das Ergebnis in der Variable „ergebnis1“. Der zweite Funktionsaufruf begrenzt die Anzahl der Leerzeichen mit dem optionalen, vierten Übergabeparameter. Er soll also im übergebenen String die ersten beiden Leerzeichen mit einer 0 ersetzen und speichert das Ergebnis anschließend in der Variable „ergebnis2“.

Der Output des obigen Codes sieht daher wie folgt aus:

'python0ist0eine0tolle0programmiersprache'
'python0ist0eine tolle programmiersprache'

re.split()

Die split()-Funktion aus dem Modul re erinnert an ihrer Funktionsweise, wie der Name schon vermuten lässt, an die Python-Built-in-Funktion split(). Auch sie teilt eine Zeichenkette in eine Liste auf. Dabei wird die Zeichenkette nach jedem Match mit einem regulären Ausdruck unterbrochen. Daher überrascht es nicht, dass die Funktion als ersten Parameter ein Suchmuster und als zweiten Parameter die zu teilende Zeichenkette erwartet. Wenn Sie einen String nur begrenzt oft splitten möchten, können Sie als dritten und optionalen Parameter eine Zahl übergeben. Diese bestimmt dann die maximale Anzahl an Splits. Wieder hilft ein Beispiel:

import re
string = "python ist eine tolle programmiersprache"
regex = "\s"
ergebnis1 = re.split(regex, string)
print(ergebnis1)
ergebnis2 = re.split(regex, string, 1)
print(ergebnis2)

Der Großteil des Codes ist Ihnen schon aus dem vorherigen Beispiel bekannt. Verändert hat sich lediglich der Funktionsaufruf von split(). Zunächst wird die split()-Funktion auf dem String aufgerufen und soll diesen bei jedem Vorkommen eines Leerzeichen teilen. Die resultierende Liste wird der Variable „ergebnis1“ zugewiesen. Der zweite split()-Aufruf begrenzt die Anzahl an Splits durch die Angabe des optionalen dritten Parameters auf 1 und weist das Ergebnis der Variablen namens „ergebnis2“ zu. Wenn das Programm ausgeführt wird, liefert es folgendes Ergebnis:

['python', 'ist', 'eine', 'tolle', 'programmiersprache']
['python', 'ist eine tolle programmiersprache']

re.search()

Wie der Name schon sagt, durchsucht die search()-Funktion einen String nach einem Match. Hierfür nimmt Sie zunächst den regulären Ausdruck und als zweiten Parameter den zu untersuchenden String entgegen. Sie liefert ein Python-Match-Objekt zurück, das sich immer auf das zuerst gefundene Match bezieht. Wenn kein Match gefunden wird, gibt die Funktion den Wert „None“ zurück. Ein Beispiel hilft abermals, sich die Arbeitsweise der Funktion zu verdeutlichen:

import re
string = "python ist eine tolle programmiersprache"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx wurde gefunden.")
else:
	print("RegEx wurde nicht gefunden.")

Die Funktion search() wird mit einem regulären Ausdruck, der nach Leerzeichen sucht, und einem String aufgerufen. Das Match-Objekt, das der Funktionsaufruf zurückliefert, wird in der Variablen namens „match“ gespeichert. Die anschließende Python if-else-Anweisung dient zu Anschauungszwecken: Wurde ein Match gefunden, ist das Match-Objekt nicht leer und der if-Pfad wird gewählt. Wenig überraschend liefert das Programm folgenden Output:

'RegEx wurde gefunden.'

Das Match-Objekt

Das Match-Objekt wird von einem search()-Aufruf zurückgegeben und beinhaltet Informationen über die gefundenen Vorkommnisse des Suchmusters. Auf diese Informationen können Sie mit verschiedenen Funktionen zugreifen:

  • objekt.start() liefert Ihnen den Index des ersten Zeichens des Python Substrings, der Ihrem Suchmuster entspricht.
  • objekt.end() gibt Ihnen analog zu start() den Index des letzten Zeichens zurück.
  • objekt.span() vereinigt start() und end(): Die Funktion liefert ein Python Tuple, das den ersten und den letzten Index des Substrings beinhaltet.
  • objekt.string liefert den String zurück, den Sie untersucht haben.
  • objekt.re liefert die Python RegEx zurück, die Sie search() übergeben haben.

All diese Funktionen kann man sich veranschaulichen, wenn man das letzte Codebeispiel um passende Funktionsaufrufe ergänzt:

import re
string = "python ist eine tolle programmiersprache"
regex = "\s"
match = re.search(regex, string)
if match:
	print("RegEx wurde gefunden.")
else:
	print("RegEx wurde nicht gefunden.")
print(match.start())
print(match.end())
print(match.span())
print(match.string)
print(match.re())

Der Output des Programms sieht folgendermaßen aus:

'RegEx wurde gefunden.'
6
7
(6, 7)
'python ist eine tolle programmiersprache'
re.compile('\\s')

Zunächst wird der String „RegEx wurde gefunden.“ ausgegeben, da das Match-Objekt nicht leer ist und daher die if-Bedingung zutrifft. Anschließend wird der Index des ersten Matches angezeigt. Da das erste Leerzeichen den Index „6“ hat, ist der Wert wenig überraschend. Ebenso sieht es mit dem Wert „7“ aus, der infolge des Aufrufs der end()-Funktion ausgegeben wird. Das Tupel „(6, 7)“ vereinigt den Aufruf von start() und end(), indem es beide Indizes auf einmal angibt. Auch der String, der dem Match-Objekt übergeben wurde, überrascht in seiner Ausgabe nicht.

Doch was hat es mit der Ausgabe „re.compile('\\s')“ auf sich? Hierbei handelt es sich um ein Python-RegEx-Objekt. Dieses entsteht, wenn die Zeichenkette, die Sie als regulären Ausdruck übergeben haben, als solcher verarbeitet wird. Wie Sie sehen, können Sie sich das RegEx-Objekt über Ihr Match-Objekt anzeigen lassen.