kurse:ef05a-2021:regex

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.

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.
  • 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)

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<

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 regexp wortliste05.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.

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

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

  • 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.

  • kurse/ef05a-2021/regex.txt
  • Last modified: 2022/05/12 09:07
  • by Ivo Blöchliger