Reguläre Ausdrücke mit Python
Überprüfung des gesamten Eingabeworts
Für die Verwendung von regulären Ausdrücken in Python bietet sich das Python-Modul
re (regular expression) an. Dabei musst du das Modul zu Beginn laden: import re
.
Danach kannst du die Funktion re.fullmatch(regex,wort)
verwenden. Sie gibt zurück, ob ein Wort
als Ganzes dem Muster des übergebenen regulären Audruck folgt. Im Beispiel hier prüft das Programm
für das eigegebene Wort, ob es dem Muster folgt, das in der Variablen regex
gespeichert wurde.
Aufgabe 1
- Teste das Programm mit verschiedenen Eingaben.
- Ändere das Programm ab, damit nur Wörter akzeptiert werden, die mit "b" beginnen und mindestens zwei "a" enthalten. Teste dein Programm mit verschiedenen Eingaben!
- Schreibe ein Programm, das solange eine Eingabe vom Benutzer möchte, bis dieser einen PIN-Code mit vier Ziffern eingegeben hat.
- Schreibe ein Programm, das solange eine Eingabe einliest, bis eine korrekte Uhrzeit eingegeben wurde.
Suchen von Mustern in einem Text
Reguläre Ausdrücke werden oft verwendet, um ein bestimmtes Muster innerhalb eines
Textes oder einer Datei zu finden. Im Beipielprogramm hier sollen Textstellen gefunden werden, an denen mindestens 2 Vokale aufeinanderfolgen ("[aeiou]{2,}"
).
Dazu kannst du die Funktion re.finditer( regex , text )
verwenden. Sie
findet iterativ alle Vorkommen des Musters im eingegebenen Text. Die Trefferliste kannst
du im Anschluß mit einer for-Schleife durchlaufen und für jeden Treffer die Position
(den Indexbereich) im Text
mit den Funktionen start()
und end()
ermitteln.
Aufgabe 2
- Teste das Programm mit verschiedenen Eingaben.
- Ändere das Programm ab, damit auch Doppelvokale am Wortanfang (z.B. bei "Eis") ausgegeben werden.
- Schreibe ein Programm, das einen Medienbeitrag einliest und alle gefundenen Hashtags (ohne das "#"-Zeichen) ausgibt.
- Finde in einem Eingabetext alle Geldangaben in Euro und gibt die Summe der gefundenen Beträge aus!
Aufgabe 3 - E-Mail-Adressen analysieren
In der Datei inf-schule-emails.liste wurden 1000 zufällige E-Mail-Adressen erzeugt. Lade diese Datei herunter und führe das folgende Programm auf deinem PC im selben Ordner wie die Datei aus.
import re
regex = "[^@]{2,}@[^@]{4,}" # mind. 2 Zeichen vor dem "@" und mind. 4 dahinter
with open("inf-schule-emails.liste", 'r') as datei:
adressen = datei.readlines() # Liest alle Zeilen der Datei
for adresse in adressen:
adresse=adresse.strip() # Entfernen des Zeilenumbruchs
if re.fullmatch( regex , adresse ):
print(adresse)
Jetzt müsstest du die komplette Liste der E-Mail-Adressen ausgegeben bekommen, da alle Adressen länger sind, als im regulären Ausdruck gefordert.
Ergänze das Programm, damit ...
- nur E-Mail-Adressen ohne Ziffern ausgegeben werden.
- nur E-Mail-Adressen mit kurzem Vor- und Nachnamen ausgegeben werden (je max. 4 Zeichen). Hinweis: der Punkt (".") ist ein Metazeichen und muss mit "\." maskiert werden!
- nur E-Mail-Adressen der Domain inf-schule.de ausgegeben werden, die mit einer Ziffer beginnen.
- nur E-Mail-Adressen ausgegeben werden, bei denen die Quersumme der Ziffern größer 20 ist.
Zusatzaufgabe: Denke dir eine eigene Anwendung mit regulären Ausdrücken und Dateien aus!
Projektidee HTMl-Code
HTML-Quelltext anfordern und analysieren
Hier siehst du einen Ausschnitt aus dem Quelltext der Startseite von inf-schule.de. Gelb markiert ist eine Stelle, an der ein Hauptkapitel (hier: Algorithmen) definiert wurde.
Du könntest z.B. alle Kapitelnamen im HTML-Quelltext automatisiert finden und ausgeben. Aus dem Ausschnitt lässt sich der folgende
reguläre Ausdruck ableiten: title\">[^<]*</div>
. Das Element [^<]
bedeutet
dabei, dass es sich um alle Zeichen außer dem "<" handeln darf. Das "^" ist also ein Metazeichen für "nicht".
Im folgenden Quellcode wird mit dem Modul requests eine Verbindung zum Server aufgebaut und der HTML-Quelltext angefordert, empfangen und dann analysiert:
import re
import requests
url = "https://inf-schule.de" # Deine Ziel-Domain
response = requests.get(url)
if response.status_code == 200:
text = response.text
else:
text=""
print("no response")
regex = "title\">[^<]*</div>"
treffer = re.finditer( regex , text )
for fund in treffer:
anf = fund.start()+7 # ohne "title\>"
ende = fund.end()-6 # ohne "</div>"
print(text[anf:ende] + "("+str(anf) + "-" + str(ende-1) + ")" )
Das Program kannst du z.B. in Thonny laden und ausführen. Evtl. musst du noch das Modul requests nachinstallieren.
Suche dir eine eigene spannende Aufgabe, um automatisiert aus einer Internetseite Informationen herauszulesen!