Python re unendliche Ausführung

Ich versuche diesen Code auszuführen:

import re pattern = r"(\w+)\*([\w\s]+)*/$" re_compiled = re.compile(pattern) results = re_compiled.search('COPRO*HORIZON 2000 HOR') print(results.groups()) 

Aber Python antwortet nicht. Der Prozess dauert 100% der CPU und hört nicht auf. Ich habe versucht, dies sowohl auf Python 2.7.1 und Python 3.2 mit identischen Ergebnissen.

4 Solutions collect form web for “Python re unendliche Ausführung”

Ihr Regex läuft in katastrophalen Backtracking, weil Sie verschachtelte Quantifizierer ( ([...]+)* ) haben. Da dein Regex die Zeichenfolge benötigt, um in / (was bei deinem Beispiel fehlschlägt) zu beenden, versucht der Regex-Motor alle Permutationen des Strings in der vergeblichen Hoffnung, eine passende Kombination zu finden. Da bleibt es

Um zu veranschaulichen, nehmen wir "A*BCD" als die Eingabe zu deinem regex an und sehen, was passiert:

  1. (\w+) entspricht A Gut.
  2. \* Entspricht * . Yay.
  3. [\w\s]+ entspricht BCD . OK.
  4. / Nicht passend (keine Zeichen übrig zu entsprechen). OK, lass uns ein Zeichen zurücksetzen.
  5. / Nicht mit D übereinstimmen. Summen. Lass uns noch etwas mehr unterstützen.
  6. [\w\s]+ entspricht BC , und die wiederholten [\w\s]+ stimmt mit D überein.
  7. / Stimmt nicht überein. Back up
  8. / Nicht mit D übereinstimmen. Sichern Sie sich noch mehr.
  9. [\w\s]+ entspricht B , und die wiederholte [\w\s]+ entspricht CD .
  10. / Stimmt nicht überein. Sichern Sie sich wieder.
  11. / Nicht mit D übereinstimmen. Sichern Sie noch einmal mehr.
  12. Wie wäre es mit [\w\s]+ Streichhölzer B , wiederholt [\w\s]+ stimmt mit C überein, wiederholt [\w\s]+ entspricht D ? Nein? Lass uns etwas anderes ausprobieren.
  13. [\w\s]+ entspricht BC . Lass uns hier aufhören und sehen was passiert
  14. Darn, / stimmt noch nicht mit D überein.
  15. [\w\s]+ Spiele B
  16. Noch kein Glück. / Stimmt nicht mit C überein.
  17. Hey, die ganze Gruppe ist optional (...)* .
  18. Nein, noch stimmt nicht mit B überein.
  19. OK ich gebe auf.

Nun war das eine String von nur drei Briefen. Ihr hatte ungefähr 30 und versuchte alle Permutationen, von denen Ihr Computer bis zum Ende der Tage beschäftigt bleiben würde.

Ich nehme an, was du versuchst zu tun ist, um die Saiten vor / nach * , in welchem ​​Fall, verwenden

 pattern = r"(\w+)\*([\w\s]+)$" 

Interessanterweise läuft Perl sehr schnell

 -> perl -e 'print "Match\n" if "COPRO*HORIZON 2000 HOR" =~ m|(\w+)\*([\w\s]+)*/$|' -> perl -e 'print "Match\n" if "COPRO*HORIZON 2000 HOR/" =~ m|(\w+)\*([\w\s]+)*/$|' Match 

Versuchen Sie re2 oder irgendeine andere reguläre Ausdruck-Engine-Basis auf der Automaten-Theorie. Die eine in einem aktuellen Python-Re-Modul ist eine einfache und langsame Backtracking-Engine (; jetzt können sich die Dinge in Zukunft ändern). Aber Automaten-basierte Motoren haben eine gewisse Einschränkung, es würde Ihnen nicht erlauben, Rückreferenzen zum Beispiel zu verwenden. Sortieren Sie mit dieser re2-Syntax-Seite , um herauszufinden, dass es Ihre Bedürfnisse erfüllt oder nicht.

Sieht aus, als wäre es etwas in deinem Muster. Ich bin nicht sicher, was du mit dem letzten '*' in deinem Ausdruck zu tun versuchst. Der folgende Code scheint für mich zu arbeiten:

 import re pattern = r"(\w+)\*([\w\s]+)$" re_compiled = re.compile(pattern) results = re_compiled.search('COPRO*HORIZON 2000 HOR') print(results.groups()) 
  • Perl kompatibler regulärer Ausdruck (PCRE) in Python
  • Python, wie man etwas wie .gitignore Verhalten zu implementieren
  • Gibt es ein Äquivalent zu der Perl Regexes '\ K Backslash Sequenz in Python?
  • Mehrere Phrasen Matching Python Pandas
  • Python Regex Engine - "look-behind erfordert feste Breite Muster" Fehler
  • Python regex, um ein Wort zu erkennen, existiert
  • Python-Regex - Fremde-Matchings
  • Kann Regex für diese spezielle Stringmanipulation verwendet werden?
  • Python regex: Aufteilung auf Muster Match, die eine leere Zeichenfolge ist
  • Regulärer Ausdruck: Bereich finden, außer für einen Buchstaben oder einen Bereich
  • Wie man '\ xe2' aus einer Liste entfernt
  • Python ist die beste Programmiersprache der Welt.