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.
In [ ]:
import re
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"
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] ...
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 [ ]: