Das Parsen von realem Text erfordert oft einen einzigen Regex, um ein strukturiertes Element zu erkennen – Codes wie H1 oder (AH2b+EUH3) – und die darauf folgende Nachricht zu erfassen. Als eine Zeile geschrieben, verwandelte sich dieses Muster in eine dichte Wand aus Satzzeichen: verschachtelte Gruppen, Lookaheads und Quantoren ohne Platz für Kommentare, und jede Änderung bedeutete, den gesamten String entwirren zu müssen. Die naheliegenden Lösungen hatten jeweils einen Preis: den Einzeiler beibehalten, und jede Bearbeitung bleibt riskant; den ausführlichen Modus von Hand schreiben, und dasselbe Untermuster wird überall dort dupliziert, wo es erscheint; eine Regex-Bibliothek hinzufügen, und man lernt neue Syntax plus eine Abhängigkeit.

Der Schritt bestand darin, das Muster als Code zu behandeln. Der Autor definierte jede logische Einheit einmal – ein Code-Fragment wie [A-Z]*H, den Multicode, der durch Pluszeichen getrennte Codes umschließt, dann den vollständigen Matcher – jeweils als rohen ausführlichen String mit Kommentaren in jeder Zeile, wobei größere Muster aus kleineren über {code}-Platzhalter zusammengesetzt wurden. Weil re.VERBOSE Leerraum und Hash-Kommentare ignoriert, liest sich jedes Fragment von oben nach unten: Klammern und Alternationen werden zu sichtbarer Struktur statt zu Glyphensuppe. Weil f-Strings zur Build-Zeit aufgelöst werden, ist das, was das re-Modul erreicht, immer noch ein einfacher Muster-String.

Der Gewinn liegt genau dort, wo Einzeiler-Regexes wehtun. Jedes Fragment wird einmal definiert, sodass eine Grammatikänderung jedes Muster aktualisiert, das es einbettet; Fragmente können einzeln mit re.findall getestet werden, bevor sie zusammengefügt werden; und nichts Neues kam in den Stack – der Autor nutzte zwei lang koexistierende Standardbibliotheksfunktionen und gibt zu, dass er drei Jahre brauchte, um die Kombination zu erkennen. Der Beitrag dokumentiert die Fallstricke: Hashes und Leerzeichen müssen maskiert oder in Zeichenklassen gesetzt werden, geschweifte Quantoren müssen innerhalb von f-Strings verdoppelt werden, und Inline-(?x)-Flags halten den ausführlichen Modus am Laufen, wenn der Aufrufer die Flags kontrolliert.

Den Regex wie Code strukturieren: jedes Fragment einmal als kommentierten ausführlichen String definieren und das endgültige Muster mit f-Strings zusammensetzen

re.VERBOSE ignoriert bereits Leerraum und Kommentare, sodass sich jedes Fragment wie dokumentierter Code liest, der nur die Standardbibliothek verwendet.

F-String-Interpolation fügt Fragmente zur Build-Zeit zusammen und hinterlässt einen einfachen Muster-String, den jeder re-Aufruf unverändert akzeptiert.

Jedes Fragment wird einmal definiert, sodass eine Grammatikänderung jedes zusammengesetzte Muster aktualisiert, statt wiederholte Inline-Kopien zu ändern.

Fragmente sind vor der Komposition isoliert testbar, sodass sich Fehler auf die Verbindungsstellen zwischen ihnen lokalisieren lassen.

Null Abhängigkeiten und keine neue DSL bedeuten, dass der Ansatz ohne Einrichtung auf jede Python-3.6+-Codebasis übertragbar ist.

Wenn ein Muster der Wartung widersteht, füge keine Bibliothek hinzu: Kombiniere Funktionen, die du bereits hast – ausführliche Kommentare für Lesbarkeit, Interpolation für Wiederverwendung – ohne Abhängigkeiten.

Im Mai 2022 veröffentlicht, erzielte er 304 Punkte und 90 Kommentare auf Hacker News; die Reaktionen teilten sich zwischen der Betrachtung des Beitrags als Offenbarung und dem Hinweis, dass das Aufteilen von Regexes in wiederverwendbare Untermuster bereits gängige Praxis war. Kommentatoren verwiesen auf stärkere Mechanismen – PCREs und Perls DEFINE-Subroutinenblöcke sowie das Drittanbieter-regex-Modul – für Wiederverwendung ohne Interpolation, und der Autor fügte einen Bonusabschnitt hinzu, der denselben Parser mit DEFINE zeigt. Der Beitrag bleibt live mit diesen dokumentierten Einschränkungen und seiner Kernaussage intakt: komponierbare, kommentierte Muster ohne Abhängigkeiten.

DEN BELEGEN FOLGEN

Die Quellen

  1. The unreasonable effectiveness of f-strings and re.VERBOSE death.andgravity.com · death.andgravity.com
  2. The unreasonable effectiveness of f-strings and re.verbose — Hacker News discussion Hacker News · news.ycombinator.com ·