Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:efi-2023:regex [2023/12/05 14:09] – [Realworld-Aufgabe: Christbaum-Logdaten analysieren] Ivo Blöchliger | lehrkraefte:blc:informatik:efi-2023:regex [2023/12/14 08:25] (current) – [Ausprobieren] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== 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 " | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Quantoren: | ||
| + | * '' | ||
| + | * '' | ||
| + | * ''?'' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Gruppen: | ||
| + | * '' | ||
| + | |||
| + | Alternativen: | ||
| + | * '' | ||
| + | |||
| + | |||
| + | ===== Ausprobieren ===== | ||
| + | * https:// | ||
| + | |||
| + | * http:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | ==== Aufgabe: Links extrahieren ==== | ||
| + | * Extrahieren Sie alle Links von folgendem Code-Schnipsel: | ||
| + | <code txt> | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | <a href=' | ||
| + | </ | ||
| + | * Vervollständigen Sie obige Links mit der vollständigen Adresse: https:// | ||
| + | * Im angezeigten Text soll die Pfadangabe und das .html verschwinden (also nur noch wordle anstatt ./ | ||
| + | |||
| + | |||
| + | <hidden Lösungsvorschläge> | ||
| + | <code txt> | ||
| + | search for | ||
| + | ' | ||
| + | |||
| + | search for | ||
| + | ' | ||
| + | replace by | ||
| + | ' | ||
| + | |||
| + | search for | ||
| + | > | ||
| + | replace by | ||
| + | >$1< | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Realworld-Aufgabe: | ||
| + | Kopieren Sie die log-Datei vom Christbaum und analysieren Sie diese. | ||
| + | <code bash> | ||
| + | scp ef: | ||
| + | </ | ||
| + | Mögliche Fragen: | ||
| + | * Welches Programm wurde besonders oft ausgewählt? | ||
| + | * Um welche Uhrzeiten hat der Bewegungsmelder etwas wahrgenommen? | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | import re | ||
| + | |||
| + | fn = " | ||
| + | |||
| + | with open(fn, " | ||
| + | lines = f.readlines() | ||
| + | |||
| + | pattern = re.compile(" | ||
| + | #pattern = re.compile(" | ||
| + | |||
| + | for line in lines: | ||
| + | res = pattern.search(line) | ||
| + | if res: | ||
| + | # | ||
| + | print(res.group(1)) | ||
| + | </ | ||
| + | ==== Realworld-Aufgabe: | ||
| + | Hier finden Sie einen Screenshot und den zughörigen HTML-Code: {{lehrkraefte: | ||
| + | |||
| + | Schreiben Sie ein Python-Programm mit regular Expressions, | ||
| + | |||
| + | === Warum das Blödsinn ist === | ||
| + | Gegen eine UI zu programmieren, | ||
| + | |||
| + | 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)): | ||
| + | <code javascript> | ||
| + | Array.from(document.querySelectorAll(' | ||
| + | </ | ||
| + | Liefert ein Array mit den gewünschten Einträgen. | ||
| + | |||
| + | |||
| + | |||
| + | ==== Weitere Übungen ==== | ||
| + | Mit einem [[https:// | ||
| + | |||
| + | 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 '' | ||
| + | * Entfernen Sie alle Zahlen (und den Leerschlag) | ||
| + | * Hinweis: das könnte auch auf der Kommandozeile mittels '' | ||
| + | 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:// | ||
| + | * 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 {{kurse: | ||
| + | |||
| + | <hidden Lösungsvorschlag auf der Kommmandozeile> | ||
| + | <code bash> | ||
| + | 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 ' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Wordle-Pro mit regular Expressions ==== | ||
| + | Aus den 6308 Wörtern, was ist die Lösung zu folgenden Wordle-Rätseln? | ||
| + | |||
| + | {{: | ||
| + | <code txt> | ||
| + | [^OENICHKAGL\n]{3}LT | ||
| + | </ | ||
| + | < | ||
| + | {{: | ||
| + | |||
| + | |||
| + | Hinweis: N muss an erster oder vierter Stelle stehen. Mit dem Pipe Zeichen '' | ||
| + | <code txt> | ||
| + | ^NRA[^BOTULKGZA]S|^[^BOTULKGZA]RANS | ||
| + | </ | ||
| + | < | ||
| + | {{: | ||
| + | <code txt> | ||
| + | ^S[^INDZGERPT]O[^INDZGERPT]{2} | ||
| + | </ | ||
| + | < | ||
| + | {{: | ||
| + | |||
| + | <code txt> | ||
| + | ^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/ | ||
| + | * HTML: direkt mit JavaScript und z.B. [[https:// | ||
| + | * 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:// | ||
| + | |||