Mustersuche mit Python
Durchsuchen langer Texte
Es kommt des öfteren vor, dass man bestimmte Zeichenketten in einem langen Text suchen möchte. Textverarbeitungsprogramme stellen in der Regel spezielle Suchfunktionen für diesen Zweck bereit.
Die RFC 5322 ist ein recht langer Text, in dem der Aufbau einer E-Mail spezifiziert wird. Dieser Text soll mit Hilfe von Python nach bestimmten Zeichenmustern durchsucht werden. Das folgende Programm zeigt, wie man das mit Hilfe regulärer Ausdrücke machen kann.
import re def suchen(regAusdruck, textdatei): f = open(textdatei, 'r', encoding = 'iso-8859-1') rfctext = f.read() f.close() for match in re.finditer(regAusdruck, rfctext): print(match.group()) # Test suchen("([1-9ABC]\.)+", "rfc5322.txt")
Das Modul re
stellt die zur Verarbeitung regulärer Ausdrücke benötigten Operationen
bereit.
Die Anweisung re.finditer(regAusdruck, rfctext)
erzeugt einen Iterator,
der über alle gefundenen, nicht überlappenden Übereinstimmungen iteriert.
Die Funktion suchen(regAusdruck, textdatei)
gibt somit alle Zeichenketten in der übergebenen
Textdatei aus, die dem übergebenen regulären Ausdruck entsprechen.
Anstatt einen Iterator zu benutzen, kann man auch die gefundenen Zeichenketten in Form einer Liste
erzeugen lassen. Hierzu stellt das Modul re
die Operation re.findall(regAusdruck, rfctext)
zur Verfügung.
Aber Achtung, runde Klammern zur Gruppierung von Teilausdrücken werden bei dieser Operation
etwas merkwürdig behandelt (siehe Python-Dokumentation).
import re def suchen(regAusdruck, textdatei): f = open(textdatei, 'r', encoding = 'iso-8859-1') rfctext = f.read() f.close() return re.findall(regAusdruck, rfctext) # Test print(suchen("(?:[1-9ABC]\.)+", "rfc5322.txt"))
Aufgabe 1
Besorge dir die RFC 5322 und teste die oben gezeigten Suchfunktion.
Aufgabe 2
Reguläre Ausdrücke enthalten neben Zeichen, die in den gesuchten Zeichenfolgen vorkommen können, auch
sogenannte Metazeichen. Im regulären Ausdruck RFC[0-9]+
sind dies die Zeichen [
,
]
, -
und +
. Weitere Metazeichen, die in regulären Ausdrücken vokommen können, sind
die Zeichen *
, ?
, |
, \
, (
und )
. Ziel dieser Aufgabe ist es,
experimentell die Bedeutung der Metazeichen herauszufinden.
Benutze die folgenden regulären Ausdrücke als Suchmuster und lasse sie mit dem oben gezeigten Python-Programm beim Text RFC 5322 auswerten. Beschreibe jeweils, wonach gesucht wird.
- 0
- 0+
- 00+
- 00*
- [0-9]
- [1-9]\.
- ([1-9]\.)+
- ([1-9ABC]\.)+
- [1-9]\.?[1-9]
- From:|To:
Denke dir selbst weitere Suchmuster aus, um die Bedeutung der Metazeichen zu erschließen.
Aufgabe 3
Entwickle einen regulären Ausdruck, mit dem man alle in der RFC 5322 vorkommenden E-Mail-Adressen als Suchergebnis geliefert bekommt.