Regular expression-Implementierung-details
Einen die Frage, die ich beantwortet hat mich gefragt:
Wie werden reguläre Ausdrücke in Python implementiert? Welche Art von Effizienz garantiert gibt es? Ist die Umsetzung "standard", oder ist das Thema zu ändern?
Dachte ich, dass reguläre Ausdrücke umgesetzt würde, wie DFAs und waren daher sehr effizient (was bei den meisten ein scan des Eingabe-string). Laurence Gonsalves hob ein interessanter Punkt, dass nicht alle Python reguläre Ausdrücke sind reguläre. (Sein Beispiel ist r"(a+)b\1", das entspricht eine gewisse Anzahl von a, a b, und dann die gleiche Anzahl von a ' s wie vorher). Dies kann nicht realisiert werden mit einem DFA.
Also, um zu wiederholen: was sind die details der Implementierung und die Gewährleistung der Python reguläre Ausdrücke?
Es wäre auch schön, wenn jemand geben könnte, irgendeine Art von Erklärung (im Lichte der Umsetzung), warum die regulären Ausdrücke "cat|catdog" und "catdog|Katze" führen unterschiedliche Ergebnisse in der Zeichenfolge "catdog", wie erwähnt, in Frage, auf die ich verwiesen vor.
- Heutige Implementierungen von regulären Ausdrücken haben weit mehr Funktionen als die klassische definition von regulären Ausdrücken beschrieben.
- In der Tat, Sie tun... das ist sozusagen der Grund für meine Frage. Ich bin neugierig auf eine konkrete Umsetzung, denn es ist wirklich nicht sicher, dass ein DFA verwendet wird (wegen der zusätzlichen features).
- Verwenden Sie die Quelle, Luke (svn.python.org/view/python/trunk/Lib/re.py?view=markup). Es scheint in der Tat ziemlich gut dokumentiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python-re-Modul wurde basierend auf PCRE, aber hat sich bewegt, um Ihre eigene Implementierung.
Hier ist der link zu der C-code.
Scheint es, als ob die Bibliothek basiert auf rekursiven backtracking, wenn ein falscher Weg genommen worden ist.
Regulären Ausdruck und text Größe n
ein?n - an passendern
Beachten Sie, dass dieser graph ist nicht repräsentativ für den normalen regex-suchen.
http://swtch.com/~rsc/regexp/regexp1.html
findall
findet nur alle nicht-überlappenden Treffern. So sollten Sie nicht erwarten, dass "Katze" UND "catdog". Zweitens, wenn ich dies auch umzusetzen, ich denke, es ist leicht zu sagen, der NFA umgewandelt werden können, um einen DFA und so hätten Sie "c -> a -> t -> d -> o> g" wo Sternchen Kennzeichnen einen endgültigen Status.[ab]*b[ab]^n
erfordertO(2^n)
Speicher mit einem DFA, aber getan werden kann, in der linearen Zeit und der Speicher, über ein NFA._sre
, die ist in C geschrieben: github.com/python/cpython/blob/master/Modules/_sre.cGibt es keine "Effizienz garantiert" auf Python-REs mehr als auf jedem anderen Teil der Sprache (C++standard-Bibliothek ist die einzige weit verbreitete standard-Sprache, die ich kenne, die versucht, solche standards-aber es gibt keine standards, auch in C++, die angeben, dass, sagen wir, die Multiplikation von zwei Ganzzahlen nehmen müssen konstanter Zeit, oder etwas in der Art), noch ist es eine Garantie dafür, dass große Optimierungen nicht angewendet wird, zu jeder Zeit.
Heute, F. Lundh (ursprünglich verantwortlich für die Implementierung der Python-das aktuelle RE-Modul etc.), präsentiert Unbeladenen Schwalbe auf Pycon Italia, erwähnt, dass einer der Wege, Sie werden erkunden, ist das kompilieren von regulären Ausdrücken direkt LLVM-Zwischencode (als auf Ihre eigenen bytecode Geschmack interpretiert werden, die von einem ad-hoc-runtime) -- da gewöhnliche Python-code wird auch immer erstellt, um LLVM (in einem bald anstehenden release von Unbeladenen Schwalbe), ein RE und Umgebung Python-code könnte dann zusammen optimiert, auch in ziemlich aggressiver Weise manchmal. Ich bezweifle, dass so etwas irgendwo in der Nähe von "production-ready", sehr bald, obwohl;-).
Matching reguläre Ausdrücke mit der Rückverweise ist NP-hart, die mindestens genauso hart wie NP-Vollständige. Das bedeutet grundsätzlich, dass es so schwer wie jedes problem, die Sie wahrscheinlich zu begegnen, und die meisten computer-Wissenschaftler glauben, es könnte benötigen exponentielle Zeit im schlimmsten Fall. Wenn Sie übereinstimmen könnte eine solche "normale" Ausdrücke (die sind wirklich nicht, im technischen Sinne) in polynomieller Zeit, die Sie gewinnen könnten,eine million Dollar.