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”
.
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{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.
Ausprobieren
- https://regex101.com/ Verwenden Sie ECMAScript (JavaScript)
Links extrahieren
- Extrahieren Sie alle Links von folgendem Code-Schnipsel:
<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>
- Vervollständigen Sie obige Links mit der vollständigen Adresse: https://ofi.tech-lab.ch/2022/EF05a/
- Im angezeigten Text soll die Pfadangabe und das .html verschwinden (also nur noch wordle anstatt ./05c7c22f/wordle.html)
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:
- Extrahieren Sie erst die Zeilen, deren Wörter mindestens 100 mal gefunden wurden.
- Hinweis: Das könnte auch auf der Kommandozeile mittels
grep -e
regexpwortliste05.txt
geschehen.
- Entfernen Sie alle Zahlen (und den Leerschlag)
- Hinweis: das könnte auch auf der Kommandozeile mittels
cut -f1 -d“ ”
erreicht werden.
Dann wollen wir mal «spezielle» Wörter suchen:
- Suchen Sie alle Wörter, die einen Doppelbuchstaben (zwei gleich hintereinander) haben.
- Suchen Sie alle Wörter, in denen ein Buchstabe zwei mal vorkommt.
- Suchen Sie alle Wörter, in denen ein Buchstabe drei mal vorkommt.
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:
- Evtl. ß durch ss ersetzen.
- Evtl. ä, ö, ü durch ae, oe, ue ersetzen.
- Wörter die aus genau 5 Buchstaben A-Z und a-z bestehen
- Nur der erste Buchstaben darf gross sein, alle anderen müssen klein sein.
- Das Wort muss mindestens einen Vokal enthalten.
- Liste sortieren, doppelte Wörter entfernen.
- Danach bleiben 6308 Wörter.
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
- HTML: direkt mit JavaScript und z.B. document.querySelector arbeiten.
- JSON: Daten parsen (in irgendeiner Programmiersprache) und direkt dort manipulieren.
- XML: dafür gibt es ebenfalls Parser
Das Problem mit «selbstgestrickten» regular Expressions ist, dass diese halt schnell an ihre Grenzen stossen und zu wenige oder zu viele Resultate liefern.
Weiterführende Links
- Advanced stuff: http://rexegg.com/regex-best-trick.html