Verständnis des Verhaltens des Zeichens $ in regulären Ausdrücken in Python
- Bei Verwendung des
re-Moduls von Python ist allgemein bekannt, dass ^ den „Anfang des Strings“ bedeutet und $ das „Ende des Strings“.
- Allerdings bedeutet
$ nicht immer ausschließlich das „Ende des Strings“, und das Verhalten kann je nach Plattform unterschiedlich sein.
- In Python kann das Zeichen
$, wenn der Multiline-Modus deaktiviert ist, mit dem Ende des Strings oder mit dem Zeilenumbruch vor dem Stringende übereinstimmen.
Unterschied zwischen Stringende und Übereinstimmung mit Zeilenumbruch
- Wenn der Multiline-Modus deaktiviert ist, reicht in Python die Verwendung von
$ allein nicht aus, um ohne Zeilenumbruch genau das Ende des Strings zu treffen.
- Um das Ende des Strings abzugleichen, können
\z und \Z verwendet werden.
- Wenn in Python
re.MULTILINE verwendet wird, stimmt $ sowohl mit dem Ende des Strings als auch mit dem Ende jeder Zeile überein, also unmittelbar vor dem Zeilenumbruch.
Vergleich des Verhaltens regulärer Ausdrücke auf verschiedenen Plattformen
- Eine Tabelle, die das Pattern-Matching für "cat\n" auf mehreren Plattformen vergleicht, zeigt: Wenn eine Übereinstimmung einschließlich des Zeilenumbruchs erlaubt ist, funktioniert die Verwendung von
$ im Multiline-Modus konsistent.
- Wenn ohne Einbeziehung des Zeilenumbruchs abgeglichen werden soll, sollte auf allen Plattformen außer Python und ECMAScript
\z verwendet werden; in Python und ECMAScript jeweils \Z oder $ ohne Multiline-Modus.
Meinung von GN⁺
- Dieser Artikel kann Entwickler, die reguläre Ausdrücke verwenden, auf das unerwartete Verhalten des Zeichens
$ in Python aufmerksam machen.
- Reguläre Ausdrücke sind bei der String-Verarbeitung sehr mächtig, doch das Verhalten kann sich je nach Plattform unterscheiden, weshalb Vorsicht geboten ist.
- Entwickler sollten sich dieser Unterschiede bewusst sein und zusätzliche Tests durchführen, um Kompatibilitätsprobleme bei der Entwicklung plattformübergreifender Anwendungen zu vermeiden.
- Andere Bibliotheken für reguläre Ausdrücke mit ähnlicher Funktionalität sind etwa Javas
java.util.regex und .NETs System.Text.RegularExpressions; auch bei ihnen sollte man die plattformspezifischen Verhaltensunterschiede verstehen und berücksichtigen.
- Bei der Einführung neuer Syntax oder neuen Verhaltens in regulären Ausdrücken sollten die Kompatibilität mit bestehendem Code, Performance-Auswirkungen und die Lernkurve im Team berücksichtigt werden; die daraus entstehenden Vorteile und Kosten sollten sorgfältig abgewogen werden.
1 Kommentare
Hacker-News-Kommentare
grep,sed,awk, Python usw.) behandeln es standardmäßig als Zeilenende.\s_-statt\w(oder irgendetwas, das ohne Referenzdokumentation auf dem Bildschirm erscheint) als Zeichenklasse, aber Emacs hat die beste Dokumentation und Auffindbarkeit.perlre-Dokumentation wird $ so erklärt: Matcht das Ende der Zeichenkette (oder vor dem Newline-Zeichen am Ende der Zeichenkette; oder vor jedem Newline-Zeichen, wenn /m verwendet wird)\Aund\Zoder das jeweilige Äquivalent.