Table of Contents

Regular Expressions

Beschreibung von Text-Mustern. Zum Suchen, Extrahieren und Ersetzen von Text. Gibt es in (fast) allen Programmiersprachen und jedem besseren Text-Editor (z.B. Notepad++, VisualCode, vim, etc.)

Je nach Implementation gibt es kleine Unterschiede zwischen Programmiersprachen oder Text-Editoren.

Wichtigste Spezialzeichen

Wenn nicht speziell, steht ein Zeichen für sich selbst in einer regular Expression. Z.B. matcht /hallo/ nur genau “hallo”

Quantoren:

Gruppen:

Alternativen:

Ausprobieren

<a href='./68ac1106/spaceadventure.html'>./68ac1106/spaceadventure.html</a><br>
<a href='./0475c543/mouseEffect.html'>./0475c543/mouseEffect.html</a><br>
<a href='./76163dbd/Taschenrechner.html'>./76163dbd/Taschenrechner.html</a><br>
<a href='./4b29d86a/index.html'>./4b29d86a/index.html</a><br>
<a href='./05c7c22f/wordle.html'>./05c7c22f/wordle.html</a><br>
<a href='./4d4f79fa/index.html'>./4d4f79fa/index.html</a><br>
<a href='./2750fa3e/index.html'>./2750fa3e/index.html</a><br>
<a href='./projects.html'>./projects.html</a><br>

Lösungsvorschläge

Lösungsvorschläge

search for 
'(.*?)'
 
search for 
'.\/(.*?)'
replace by 
'https://ofi.tech-lab.ch/2022/EF05a/$1'
 
search for 
>\.\/.*?\/(.*?)\.html<
replace by
>$1<

Realworld-Aufgabe: Christbaum-Logdaten analysieren

Kopieren Sie die log-Datei vom Christbaum und analysieren Sie diese.

scp ef:python/logs/xmaslights-2023-11-30T164809.401678.log .

Mögliche Fragen:

import re
 
fn = "xmaslights-2023-11-30T164809.401678.log"
 
with open(fn, "r") as f:
    lines = f.readlines()
 
pattern = re.compile("since motion: (\d+\.\d+)")
#pattern = re.compile("text=")
 
for line in lines:
    res = pattern.search(line)
    if res:
        #print(line)
        print(res.group(1))

Realworld-Aufgabe: Daten aus einer Nesa-Seite extrahieren

Hier finden Sie einen Screenshot und den zughörigen HTML-Code: raumplanh21.zip.

Schreiben Sie ein Python-Programm mit regular Expressions, das den Raumplan extrahiert.

Warum das Blödsinn ist

Gegen eine UI zu programmieren, ist ok für den Einmalgebrauch. Es ist aber nicht nachhaltig, weil die UI jederzeit ändern kann (und wird!).

Auch haben wir HTML-Code vorliegen. Dieser ist bereits strukturiert und auch danach durchsuchbar. Z.B. kann man die Sache in JavaScript «relativ» einfach erledigen (In den Entwickler Tools des Webbrowsers (F12)):

Array.from(document.querySelectorAll('.stpt_event_body')).map(e=>e.getAttribute('title'))

Liefert ein Array mit den gewünschten Einträgen.

Weitere Übungen

Mit einem Crawler in Python habe ich deutsche Wortlisten erstellt: wortliste05.txt.

Diese Wortliste soll z.B. für ein Wordle-Spiel gebraucht werden. Dazu sind allerdings noch einige Aufräumarbeiten nötig:

Dann wollen wir mal «spezielle» Wörter suchen:

Auf https://sourceforge.net/projects/germandict/ gibt es eine Wortliste mit 1.2 Millionen Wörten, die in deutschen Texten vorkommen können. Extrahieren Sie daraus:

Lösungsvorschlag auf der Kommmandozeile

Lösungsvorschlag auf der Kommmandozeile

cat utf8.txt | sed -e s/ß/ss/g | sed -e s/ä/ae/g | sed -e s/ö/oe/g | sed -e s/ü/ue/g | grep -E '^[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxzy][abcdefghijklmnopqrstuvxzy]{4}$' | grep -E '[AEIOUaeiou]' | tr 'a-z' 'A-Z' | sort | uniq | wc

Wordle-Pro mit regular Expressions

Aus den 6308 Wörtern, was ist die Lösung zu folgenden Wordle-Rätseln?

[^OENICHKAGL\n]{3}LT

Hinweis: N muss an erster oder vierter Stelle stehen. Mit dem Pipe Zeichen | können mehrere Expressions durch oder verknüpft werden.

^NRA[^BOTULKGZA]S|^[^BOTULKGZA]RANS

^S[^INDZGERPT]O[^INDZGERPT]{2}

^NE[^KATJOLSHR]R[^KATJOLSHRN]|^[^KATJOLSHR]ENR[^KATJOLSHRN]

Alternativen für HTML, JSON, XML und allg. maschinenlesabare Formate

Um Daten aus HTML, JSON oder XML nachhaltig zu extrahieren/manipulieren, ist es ratsam, Werkzeuge zu verwenden, die das entsprechende Format verstehen, z.B. für

Das Problem mit «selbstgestrickten» regular Expressions ist, dass diese halt schnell an ihre Grenzen stossen und zu wenige oder zu viele Resultate liefern.