Ich habe eine Python-Template-Engine, die Regexp stark verwendet. Es verwendet Verkettung wie:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
Ich kann die einzelnen Teilzeichenfolgen (regexp1, regexp2 usw.) ändern.
Gibt es einen kleinen und leichten Ausdruck, der mit nichts übereinstimmt und den ich in einer Vorlage verwenden kann, in der ich keine Übereinstimmungen möchte? Leider wird manchmal '+' oder '*' an das Regexp-Atom angehängt, sodass ich keine leere Zeichenfolge verwenden kann - dies führt zu dem Fehler "Nichts zu wiederholen".
Antworten:
Dies sollte zu nichts passen:
re.compile('$^')
Wenn Sie also regexp1, regexp2 und regexp3 durch '$ ^' ersetzen, ist es unmöglich, eine Übereinstimmung zu finden. Es sei denn, Sie verwenden den Mehrleitungsmodus.
Nach einigen Tests fand ich eine bessere Lösung
re.compile('a^')
Es ist unmöglich, eine Übereinstimmung zu erzielen, und es wird früher als bei der vorherigen Lösung fehlschlagen. Sie können a durch ein anderes Zeichen ersetzen und es wird immer unmöglich sein, es zu finden
quelle
QtCore.QRegExp
. So schlimm, denn die Ausführung wäre sicherlich leichter gewesen.(?!)
sollte immer nicht übereinstimmen. Es ist der negative Ausblick mit der Breite Null. Wenn das, was in Klammern steht, übereinstimmt, schlägt die gesamte Übereinstimmung fehl. Da es nichts enthält, wird es das Match für nichts (einschließlich nichts) nicht bestehen.quelle
Um eine leere Zeichenfolge abzugleichen - auch im mehrzeiligen Modus - können Sie Folgendes verwenden
\A\Z
:re.compile('\A\Z|\A\Z*|\A\Z+')
Der Unterschied besteht darin, dass
\A
und\Z
Anfang und Ende der Zeichenfolge sind , während^
und$
diese mit dem Anfang / Ende der Zeilen$^|$^*|$^+
übereinstimmen können , sodass möglicherweise eine Zeichenfolge mit Zeilenumbrüchen übereinstimmen kann (wenn das Flag aktiviert ist).Wenn Sie mit nichts übereinstimmen möchten (auch nicht mit einer leeren Zeichenfolge), versuchen Sie einfach, den Inhalt vor dem Beginn der Zeichenfolge zu finden, z.
re.compile('.\A|.\A*|.\A+')
Da (per Definition) keine Zeichen vor \ A stehen können, stimmt dies immer nicht überein.
quelle
Vielleicht
'.{0}'
?quelle
Sie könnten verwenden
\z..
Dies ist das absolute Ende der Zeichenfolge, gefolgt von zwei von allem
Wenn
+
oder*
am Ende angeheftet wird, funktioniert dies immer noch und weigert sich, irgendetwas zu findenquelle
\z
erlaubt das IIRC keine nachgestellten Zeilenumbrüche\Z
, reicht also nicht aus? Oder dies ist eine seltsame Verteidigung gegen*
(warum schützen Sie sich davor?)Oder verwenden Sie ein Listenverständnis, um die nutzlosen regulären Ausdrücke zu entfernen, und verbinden Sie sie, um sie alle zusammenzufügen. Etwas wie:
re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))
Achten Sie jedoch darauf, einige Kommentare neben dieser Codezeile hinzuzufügen :-)
quelle