Regelmäßige Ausdruck Implementierung Details

Eine Frage, die ich beantwortet habe, hat mich gefragt:

Wie werden regelmäßige Ausdrücke in Python implementiert? Welche Art von Effizienzgarantien gibt es? Ist die Implementierung "Standard" oder ist es Änderungen vorbehalten?

Ich dachte, dass reguläre Ausdrücke als DFA implementiert werden würden und daher sehr effizient waren (höchstens ein Scan der Eingabezeichenfolge erforderlich). Laurence Gonsalves hat einen interessanten Punkt, dass nicht alle Python reguläre Ausdrücke regelmäßig sind. (Sein Beispiel ist r "(a +) b \ 1", das mit einer Anzahl von a, ab und dann die gleiche Anzahl von a's wie zuvor übereinstimmt). Dies lässt sich mit einem DFA nicht umsetzen.

Also, um zu wiederholen: Was sind die Implementierungsdetails und Garantien von Python regulären Ausdrücken?

Es wäre auch schön, wenn jemand irgendeine Art von Erklärung (im Lichte der Implementierung) geben könnte, warum die regulären Ausdrücke "cat | catdog" und "catdog | cat" zu unterschiedlichen Suchergebnissen in der Zeichenfolge "catdog" führen, als In der Frage erwähnt, auf die ich schon hingewiesen habe.

3 Solutions collect form web for “Regelmäßige Ausdruck Implementierung Details”

Das Re-Modul von Python basierte auf PCRE , ist aber auf ihre eigene Implementierung zurückgegangen.

Hier ist der Link zum C-Code .

Es scheint, als ob die Bibliothek auf rekursiven Backtracking basiert, wenn ein falscher Pfad genommen wurde.

Alt-Text

Regulärer Ausdruck und Textgröße n
ein? N a n passend zu n

Denken Sie daran, dass diese Grafik nicht repräsentativ für normale Regex-Suchen ist.

http://swtch.com/~rsc/regexp/regexp1.html

Es gibt keine "Effizienzgarantien" auf Python REs mehr als auf jedem anderen Teil der Sprache (C ++ 's Standardbibliothek ist der einzige weit verbreitete Sprachstandard, den ich kenne, der versucht, solche Standards zu etablieren – aber es gibt keine Standards, auch in C ++, Angabe, dass, sagen wir, Multiplikation von zwei Ints muss konstante Zeit nehmen, oder so ähnlich); Noch gibt es keine Garantie dafür, dass große Optimierungen nicht jederzeit angewendet werden.

Heute hat F. Lundh (ursprünglich verantwortlich für die Implementierung von Pythons aktuellem RE-Modul usw.), die Unladen-Schwalbe bei Pycon Italia präsentiert, erwähnt, dass einer der Wege, die sie erforschen werden, regelmäßige Ausdrücke direkt zum LLVM-Zwischencode (anstatt ihrer Eigener Bytecode-Geschmack, der von einer Ad-hoc-Laufzeit interpretiert werden soll) – da der gewöhnliche Python-Code auch bei LLVM kompiliert wird (in einer baldigen Veröffentlichung von Unladen Swallow), könnte ein RE und sein umgebender Python-Code dann gemeinsam optimiert werden, Auch in ganz aggressiven Weisen manchmal Ich bezweifle, dass so etwas irgendwann in der Nähe von "produktionsbereit" ist, aber bald ;-).

Zusammenpassende reguläre Ausdrücke mit Rückreferenzen ist NP-hart , das ist mindestens so hart wie NP-Complete . Das bedeutet im Grunde, dass es so schwer ist wie jedes Problem, das Sie wahrscheinlich begegnen werden, und die meisten Informatiker glauben, dass es im schlimmsten Fall eine exponentielle Zeit erfordern könnte. Wenn du mit solchen "regelmäßigen" Ausdrücken (die eigentlich nicht im technischen Sinne) in der Polynomzeit zusammenpassen könnten, könnte man eine Million Dollar gewinnen .

  • Python nicht gierig Regex zu reinigen xml
  • Extrahieren von Zeichen aus einer Zeichenfolge in Python
  • Entfernen Sie alle Vorkommen von Wörtern in einer Zeichenfolge aus einer Python-Liste
  • Algorithmus zum Extrahieren von Netzwerkinformationen aus ifconfig (Ubuntu)
  • In Python, wie man einen String, der eine Reihe von Keyword-Argumenten, so dass die Reihenfolge spielt keine Rolle
  • Regex und Unicode
  • Spielgruppen in Python
  • Duplikate mit Regex entfernen?
  • Finde einen Kleinbuchstaben, der von drei Großbuchstaben übergeben ist
  • Verwenden von Python, um alle Linien zu entfernen Matching Regex
  • Ersetzen von speziellen Mustern in einer Zeichenfolge, Lesen aus einer Datei
  • Python ist die beste Programmiersprache der Welt.