Gestern war StackOverflow eine halbe Stunde lang nicht verfügbar. Später schrieben sie einen Blog-Beitrag darüber , in dem sie ausführlich darlegten, dass das Problem auf eine unerwartet hohe Komplexität des Abgleichs regulärer Ausdrücke zurückzuführen sei.
Kurz gesagt, der reguläre Ausdruck a+b
wird beim Ausführen der Zeichenfolge aaaaaaaaaaaaaac
in der Zeit wobei die Anzahl der Zeichen ist, da Backtracking verwendet wird.a
Sie können das Problem mit dem folgenden Python-Code reproduzieren, dessen Ausführung auf meinem Computer mehr als 4 Sekunden dauert:
import re, time
start = time.time()
re.findall(r'\s+$', ' '*20000 + 'x')
print(time.time() - start)
Das war sehr überraschend für mich; Ich hätte gedacht, dass ein Regex-Matcher effizienter arbeitet, z. B. indem er einen DFA aus dem Regex erstellt und dann die gewünschte Zeichenfolge durchläuft, was ich für (ohne die DFA-Konstruktion).
(Zum Beispiel geht das Buch Einführung in Algorithmen von Cormen, Leiserson, Rivest einen ähnlichen Algorithmus auf dem Weg zur Einführung des Knuth-Morris-Pratt-Algorithmus durch).
Meine Frage: Gibt es etwas inhärent Schwieriges beim Abgleichen regulärer Ausdrücke, das keinen -Algorithmus zulässt , oder sprechen wir einfach von einer ineffizienten Implementierung (in Python, in was auch immer StackOverflow verwendet, usw.)?