Regular Ex­pres­si­ons, kurz RegEx, können in Python nach Im­por­tie­ren des Built-in-Pakets „re“ genutzt werden, um innerhalb von Zei­chen­ket­ten nach be­stimm­ten Mustern zu suchen.

Was genau ist Python RegEx?

Mit RegEx werden so­ge­nann­te reguläre Ausdrücke be­zeich­net. Hierbei handelt es sich um Zei­chen­ket­ten, die spe­zi­fi­sche Such­mus­ter de­fi­nie­ren. Sie können genutzt werden, um Python Strings auf ebendiese Such­mus­ter hin zu prüfen. Python RegEx folgen einer eigenen Syntax und Semantik.

Ein­satz­ge­bie­te von Python RegEx

Reguläre Ausdrücke werden häufig ein­ge­setzt, um Eingaben von Nutzenden eines Programms auf ein be­stimm­tes Format hin zu un­ter­su­chen.

Ein bekanntes und Ihnen sicher bekanntes Beispiel hierfür ist das Erstellen eines Passworts, das bei­spiels­wei­se min­des­tens einen Groß­buch­sta­ben und mindestes eine Ziffer enthalten soll. Python RegEx kann nun ein­ge­setzt werden, um Ihre Eingabe auf diese Regeln hin zu über­prü­fen.

Auch bei der Aus­fül­lung von Web­for­mu­la­ren werden reguläre Ausdrücke häufig ein­ge­setzt, um die Gül­tig­keit von Nut­zer­ein­ga­ben zu über­prü­fen. So kann bei­spiels­wei­se aus­ge­wer­tet werden, ob es sich bei einer ein­ge­ge­be­nen E-Mail-Adresse tat­säch­lich um eine E-Mail-Adresse im gültigen Format handelt.

Tipp

Wenn Sie für ein Web­pro­jekt mit Python arbeiten, werden reguläre Ausdrücke Ihnen an vielen Stellen helfen. Ebenfalls hilfreich ist Deploy Now von IONOS, das es Ihnen er­mög­licht, Ihre Web­pro­jek­te direkt via GitHub zu builden und zu deployen.

Syntax und Semantik von Python RegEx

Innerhalb von regulären Aus­drü­cken werden so­ge­nann­te Me­ta­cha­rac­ters ein­ge­setzt. Hierbei handelt es sich um Zeichen, die innerhalb von Python RegEx eine bestimmte Bedeutung haben. Die wich­tigs­ten Me­ta­cha­rac­ters inklusive ihrer Bedeutung und einem Beispiel finden Sie in folgender Über­sichts­ta­bel­le:

Zeichen Be­schrei­bung Beispiel
. Steht für jedes beliebige Zeichen außer Newline ha..o -> findet alle Strings, die mit „ha“, gefolgt von zwei be­lie­bi­gen Zeichen, gefolgt von „o“ enden, z. B. „hallo“
[] Findet alle Buch­sta­ben, die zwischen den Klammern spe­zi­fi­ziert sind [a-e] -> findet alle klein­ge­schrie­be­nen Buch­sta­ben zwischen a und e
^ Überprüft, ob String mit einem an­ge­ge­be­nen Zeichen oder einer an­ge­ge­be­nen Zei­chen­ket­te beginnt ^hallo -> überprüft, ob String mit „hallo“ beginnt
$ Überprüft, ob String mit einem an­ge­ge­be­nen Zeichen oder einer an­ge­ge­be­nen Zei­chen­ket­te 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 min­des­tens 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 ge­schweif­ten Klammern spe­zi­fi­ziert hal{2}o -> matcht bei dem String „hallo“

Sets

Besonders wichtig für die meisten Python RegEx sind die so­ge­nann­ten 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 klein­ge­schrie­be­nen Buch­sta­ben zwischen a und e findet, haben Sie bereits in der obigen Über­sichts­ta­bel­le ken­nen­ge­lernt. Nach­fol­gend finden Sie eine Übersicht über häufige Nut­zungs­fäl­le von Sets in Python RegEx:

Set Be­schrei­bung
[abc] Matcht, wenn eines der zwischen den Klammern an­ge­ge­be­nen Zeichen (also a, b, oder c) innerhalb einer Zei­chen­ket­te vorkommt
[^abc] Matcht für alle Zeichen, die nicht innerhalb der Klammern angegeben wurden
[a-z] Matcht für alle klein­ge­schrie­be­nen Buch­sta­ben zwischen a und z
[a-zA-Z] Matcht für alle Buch­sta­ben zwischen a und z, egal, ob sie groß- oder klein­ge­schrie­ben sind
[0-9] Matcht für jede Zahl zwischen 0 und 9
[1-5][0-9] Matcht für alle zwei­stel­li­gen Zahlen zwischen 10 und 59

Wie Sie sehen, sind Sets ein mächtiges Mittel für ver­schie­de­ne reguläre Ausdrücke. Bei der Nutzung von Sets gilt es al­ler­dings zu beachten, dass die oben vor­ge­stell­ten Me­ta­cha­rac­ters innerhalb der eckigen Klammern keinerlei spe­zi­fi­sche Bedeutung haben. Das Set [*] würde also alle * in einer gegebenen Zei­chen­ket­te matchen.

Sequenzen

Neben den vor­ge­stell­ten Me­ta­cha­rac­ters können Sie in Python RegEx Gebrauch von spe­zi­el­len und bereits vor­de­fi­nier­ten Sequenzen machen, um präzise Such­mus­ter zu erstellen.

Sequenz Be­schrei­bung Beispiel
\A Matcht, wenn die spe­zi­fi­zier­te Zei­chen­ket­te 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 spe­zi­fi­zier­te Zei­chen­ket­te 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 "Abend­essen""es\b"- Matcht für "Wahres"- Matcht für "Ein mutiges Kind"- Matcht nicht für "Rest"
\B Matcht, wenn spe­zi­fi­zier­te Zei­chen­ket­te 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 "Abend­essen""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; Äqui­va­lent zu [0-9] 123- \d findet drei Matches für 1, 2 und 3
\D Matcht alle Zeichen, die keine Ziffer sind; Äqui­va­lent zu [^0-9] 123acb&- \D findet vier Matches für a, c, b und &
\s Matcht, wenn der String ein Leer­zei­chen enthält Python RegEx- \s matcht, da es ein Leer­zei­chen gibt
\S Matcht, wenn der String kein Leer­zei­chen enthält; Gegenteil von \s Python RegEx- \S matcht nicht, da es ein Leer­zei­chen gibt
\w Matcht alle al­pha­nu­me­ri­schen Zeichen 1abc$%3- \w findet vier Matches für 1, a, b, c und 3
\W Matcht für alle Zeichen außer al­pha­nu­me­ri­schen Zeichen; Gegenteil von \w 1abc$%3- \W findet zwei Matches für $ und %
\Z Matcht, wenn die spe­zi­fi­zier­te Zei­chen­ket­te am Ende eines Strings ist Python\Z- Matcht für "RegEx in Python"- Matcht nicht für "Python RegEx"

Funk­tio­nen für die Nutzung von Python RegEx

Wenn Sie in Python RegEx nutzen möchten, helfen Ihnen eine Reihe vor­de­fi­nier­ter Funk­tio­nen weiter. All diese Funk­tio­nen befinden sich in einem Python-Modul namens „re“, das Sie daher bei der Arbeit mit regulären Aus­drü­cken zunächst im­por­tie­ren müssen:

import re

re.findall()

Die wohl wich­tigs­te Funktion im Umgang mit Python RegEx ist die Funktion findall(). Sie nimmt ein Such­mus­ter und einen Python String entgegen und liefert Ihnen eine Python Liste bestehend aus Strings zurück, die alle Matches in der Rei­hen­fol­ge, in der sie gefunden wurden, be­inhal­tet. Wenn kein Match gefunden wird, liefert der findall()-Aufruf eine leere Liste.

Zur Ver­an­schau­li­chung der Funktion hilft ein Code­bei­spiel:

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

Im obigen Code­schnip­sel wird zunächst wie gezeigt das Modul re im­por­tiert. In der Variable namens „string“ wird dann die Zei­chen­ket­te „python 3.0“ hin­ter­legt. Das Such­mus­ter, das in der Variable namens „regex“ ge­spei­chert 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 rea­li­siert, die als Über­ga­be­pa­ra­me­ter das Such­mus­ter und die zu un­ter­su­chen­de Zei­chen­ket­te ent­ge­gen­nimmt. Die Liste, die von der Funktion zu­rück­ge­ge­ben wird, wird in der Variable namens „ergebnis“ hin­ter­legt und mit einem Aufruf von Python print auf dem Bild­schirm aus­ge­ge­ben. Der Output sieht wie folgt aus:

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

Die Liste be­inhal­tet jedes Zeichen aus dem String mit Ausnahme der Ziffern. Zu beachten ist, dass auch das Leer­zei­chen 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 über­schrie­ben. Die Funktion nimmt als ersten Über­ga­be­pa­ra­me­ter wie findall() auch einen regulären Ausdruck. Den Text, mit dem Sie die Matches ersetzen möchten, müssen Sie als zweiten Über­ga­be­pa­ra­me­ter übergeben. Der dritte Über­ga­be­pa­ra­me­ter der Funktion ist der zu durch­su­chen­de String. Wenn Sie nicht alle, sondern nur eine bestimmte Anzahl an Matches über­schrei­ben möchten, können Sie als vierten Über­ga­be­pa­ra­me­ter eine Zahl angeben, die angibt, wie viele Matches beginnend bei dem ersten Match ersetzt werden sollen.

Auch hier hilft ein Code­bei­spiel, um sich die Funk­ti­ons­wei­se zu ver­ge­gen­wär­ti­gen:

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 im­por­tiert und im Anschluss eine Zei­chen­ket­te in der Variable „string“ hin­ter­legt. Das Such­mus­ter, das an­ge­wen­det werden soll, kennen Sie ebenfalls bereits: Es matcht auf alle Leer­zei­chen in einem String.

An­schlie­ßend folgen zwei ähnliche Aufrufe von sub(): Der erste Funk­ti­ons­auf­ruf soll alle Leer­zei­chen im über­ge­be­nen String mit einer 0 ersetzen und speichert das Ergebnis in der Variable „ergebnis1“. Der zweite Funk­ti­ons­auf­ruf begrenzt die Anzahl der Leer­zei­chen mit dem op­tio­na­len, vierten Über­ga­be­pa­ra­me­ter. Er soll also im über­ge­be­nen String die ersten beiden Leer­zei­chen mit einer 0 ersetzen und speichert das Ergebnis an­schlie­ß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 Funk­ti­ons­wei­se, wie der Name schon vermuten lässt, an die Python-Built-in-Funktion split(). Auch sie teilt eine Zei­chen­ket­te in eine Liste auf. Dabei wird die Zei­chen­ket­te nach jedem Match mit einem regulären Ausdruck un­ter­bro­chen. Daher über­rascht es nicht, dass die Funktion als ersten Parameter ein Such­mus­ter und als zweiten Parameter die zu teilende Zei­chen­ket­te erwartet. Wenn Sie einen String nur begrenzt oft splitten möchten, können Sie als dritten und op­tio­na­len 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 vor­he­ri­gen Beispiel bekannt. Verändert hat sich lediglich der Funk­ti­ons­auf­ruf von split(). Zunächst wird die split()-Funktion auf dem String auf­ge­ru­fen und soll diesen bei jedem Vorkommen eines Leer­zei­chen teilen. Die re­sul­tie­ren­de Liste wird der Variable „ergebnis1“ zu­ge­wie­sen. Der zweite split()-Aufruf begrenzt die Anzahl an Splits durch die Angabe des op­tio­na­len dritten Pa­ra­me­ters auf 1 und weist das Ergebnis der Variablen namens „ergebnis2“ zu. Wenn das Programm aus­ge­führt wird, liefert es folgendes Ergebnis:

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

re.search()

Wie der Name schon sagt, durch­sucht die search()-Funktion einen String nach einem Match. Hierfür nimmt Sie zunächst den regulären Ausdruck und als zweiten Parameter den zu un­ter­su­chen­den 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 Ar­beits­wei­se der Funktion zu ver­deut­li­chen:

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 Leer­zei­chen sucht, und einem String auf­ge­ru­fen. Das Match-Objekt, das der Funk­ti­ons­auf­ruf zu­rück­lie­fert, wird in der Variablen namens „match“ ge­spei­chert. Die an­schlie­ßen­de Python if-else-Anweisung dient zu An­schau­ungs­zwe­cken: Wurde ein Match gefunden, ist das Match-Objekt nicht leer und der if-Pfad wird gewählt. Wenig über­ra­schend liefert das Programm folgenden Output:

'RegEx wurde gefunden.'

Das Match-Objekt

Das Match-Objekt wird von einem search()-Aufruf zu­rück­ge­ge­ben und be­inhal­tet In­for­ma­tio­nen über die ge­fun­de­nen Vor­komm­nis­se des Such­mus­ters. Auf diese In­for­ma­tio­nen können Sie mit ver­schie­de­nen Funk­tio­nen zugreifen:

  • objekt.start() liefert Ihnen den Index des ersten Zeichens des Python Sub­strings, der Ihrem Such­mus­ter ent­spricht.
  • 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 Sub­strings be­inhal­tet.
  • objekt.string liefert den String zurück, den Sie un­ter­sucht haben.
  • objekt.re liefert die Python RegEx zurück, die Sie search() übergeben haben.

All diese Funk­tio­nen kann man sich ver­an­schau­li­chen, wenn man das letzte Code­bei­spiel um passende Funk­ti­ons­auf­ru­fe 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 fol­gen­der­ma­ß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.“ aus­ge­ge­ben, da das Match-Objekt nicht leer ist und daher die if-Bedingung zutrifft. An­schlie­ßend wird der Index des ersten Matches angezeigt. Da das erste Leer­zei­chen den Index „6“ hat, ist der Wert wenig über­ra­schend. Ebenso sieht es mit dem Wert „7“ aus, der infolge des Aufrufs der end()-Funktion aus­ge­ge­ben 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, über­rascht 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 Zei­chen­ket­te, die Sie als regulären Ausdruck übergeben haben, als solcher ver­ar­bei­tet wird. Wie Sie sehen, können Sie sich das RegEx-Objekt über Ihr Match-Objekt anzeigen lassen.

Zum Hauptmenü