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.
Wenn nicht speziell, steht ein Zeichen für sich selbst in einer regular Expression. Z.B. matcht /hallo/ nur genau “hallo”
.
steht für genau ein beliebiges Zeichen (ausser Zeilenumbruch)\.
steht für einen Punkt[abc246]
steht für genau ein beliebiges Zeichen in der Klammer[5-9e-k]
steht für genau ein Zeichen '5' bis '9' oder 'e' bis 'k'\d
Digit, Abkürzung für [0-9]
.\[
steht für die öffnende Klammer^
Start der Zeile (oder String)$
Ende der Zeile (oder String)Quantoren:
*
beliebig viele der Expression davor (auch Null), greedy, d.h. match't so viel wie irgend möglich+
ein oder mehrere der Expression davor, greedy?
Null oder eins, greedy{7}
genau 7{4,7}
zwischen 4 und 7, greedy*?
beliebig viele, aber lazy (d.h. match't so wenig wie möglich). Ebenso ??
, +?
und {4,7}?
.Gruppen:
(
expr)
«speichert» den Match zur späteren Verwendung mit \1
oder $1
, je nach Engine. Es wird nach öffnender Klammer nummeriert.Alternativen:
|
Die Expression davor, oder jene danach.<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>
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))
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.
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.
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:
grep -e
regexp wortliste05.txt
geschehen.cut -f1 -d“ ”
erreicht werden.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:
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]
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.