Reguläre Ausdrücke

Was ist das?

Reguläre Ausdrücke (bzw. regular expressions im Englischen) sind ein prima Hilfsmittel, um Texte nach Schlüsselwörtern zu durchsuchen. Ein Beispiel wäre alle E-Mail Adressen in einem Dokument, alle Wörter, die keine Zahlen enthalten, Alle Wörter, die mit einem Großbuchstaben beginnen, ... Die Möglichkeiten sind unbegrenzt.

Grundlegende Befehle

Benutzung in Python

Um regular expressions in Python zu benutzen, benötigen wir das Modul re. Dieses ist schon von Beginn an in der Python Standard Library enthalten. Eine ausführliche Beschreibung der Python-Regexbefehle gibt es hier und hier.


In [ ]:
import re

Ein Wort in einem Text suchen

Als allererstes simples Beispiel suchen wir einfach ein normales Wort in einem Text.

re.search

Möchten wir nur wissen, ob ein Wort im Text vorkommt, reicht meistens re.search


In [ ]:
print re.search("hallo", "123912039u123hallo4324234")
print re.search("hallo", "123912039u123ciao4324234")

In diesem Beispiel liefert uns re.search ein Match Objekt zurück. Das bedeutet, dass das gesuchte Wort im Text gefunden wurde. Kommt es nicht vor, wird ein None zurückgegeben. re.search ist besonders praktisch wenn man mit einer if-Bedingung prüfen möchte, ob ein Wort in einem String vorkommt:


In [ ]:
match = re.search("hallo", "123912039u123hallo4324234")
if match:
    print match.group(), "gefunden"

match.group() gibt uns dabei das gefundene Wort zurück. Oftmals wollen wir aber nicht nach einem fixen Wort suchen, sondern nach Wörtern, die ein bestimmtes Muster aufweisen. Als einfaches Beispiel suchen wir nun nach allen Wörtern die aus einem oder mehreren a's bestehen.


In [ ]:
m = re.search("a+", "1234567aaaaaaa987")
print m.group()

Solange in dem oberen String mindestens ein a vorkommt, wird ein Match Objekt zurückgegeben. Das Plus-Zeichen sagt genau das aus: suche alle a's, die einmal bis beliebig oft vorkommen.

Möchten wir das Plus auf eine Zeichenkette anwenden, müssen wir klammern.


In [ ]:
match = re.search("(abc)+", "1234567abcabcabcabc987")
print match.group()

Achtung: folgendes Beispiel gibt keinen Match:


In [ ]:
match = re.search("(abc)+", "acbacbacb1234567987")

Zwar kommen dort die Buchstaben a, b und c im rechten String vor. Allerdings stimmt die Reihenfolge nicht. Unsere Suche "(abc)+" wird nur einen Match liefern wenn Zeichenketten der Form

abc

abcabc

abcabcabc

abcabcabcabc

...

vorkommen

Ist uns die Reihenfolge egal, müssen wir eckige Klammern verwenden.


In [ ]:
match = re.search("[abc]+", "acbacbacb1234567987")
print match.group()

Jetzt wird nach Wörtern gesucht, die aus den Buchstaben a, b und c bestehen. Die Reihenfolge ist dabei egal.


In [ ]:
# Hier ein paar Beispiele der Länge 3
for text in ["abc", "acb", "acc", "aaa", "bbb", "ccc", "ddd"]:
    match = re.search("[abc]+", text)
    if match:
        print match.group(), "wird gematcht"
    else:
        print text, "wird nicht gematcht"

re.findall

Möchten wir mehrere Vorkommen eines Wortes in einem Text finden, hilft uns re.findall.

Als Beispiel suchen wir alle Integerzahlen in einem Text


In [ ]:
print re.findall("[1-9]+", "in d13s3m T3xt sind 31n p44r Z4hl3n versteckt.")

re.findall liefert uns brav alle Matches in einer Liste. Sehr praktisch!

Man sieht an obigem Beispiel auch, dass es möglich ist, eine Art range in den eckigen Klammern anzugeben. [0-9] ist also äquivalent zu [0123456789]. Das geht übrigens auch für Buchstaben: [a-z] oder [A-Z] oder [a-zA-Z1-9] ...

Nach verschiedenen Worten suchen


In [ ]:
re.findall("[Hh]allo|[Cc]iao", "Hallo, dies ist ein Beispieltext. Das war's auch schon. Ciao bis zum nächsten Mal!")

Suchen Sie in folgendem Text alle Telefonnummern heraus. Eine Telefonnummer fängt (bei uns) mit +49 oder 0 an, danach folgen beliebig viele Ziffern


In [ ]:
suchtext = """
Hallo, meine neue Telefonnummer ist 01234 123 42 123.

Die alte Nummer(+49 333 123 456 789) ist nicht mehr gültig.

außerdem gibt es noch 062031234567.
"""

In [ ]:


In [ ]: