Python's Regular Expression Quelle String Länge

In Python Reguläre Ausdrücke,

re.compile("x"*50000) 

Gibt mir OverflowError: regular expression code size limit exceeded

Aber nach dem man bekommt keinen Fehler, aber es trifft 100% CPU und nahm 1 Minute in meinem PC

 >>> re.compile(".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000) <_sre.SRE_Pattern object at 0x03FB0020> 

Ist das normal?

Sollte ich davon ausgehen, dass ".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 kürzer als "x"*50000 ?

Getestet auf Python 2.6, Win32

UPDATE 1 :

Es sieht aus wie ".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 könnte reduziert werden .*?

Also, wie wäre es mit diesem?

 re.compile(".*?x"*50000) 

Es kompiliert, und wenn man das auch auf ".*?x" reduzieren kann, sollte es mit dem String "abcx" oder "x" alleine übereinstimmen, aber es stimmt nicht überein.

Also, vermisse ich etwas?

UPDATE 2 :

Mein Punkt ist nicht zu wissen, max Limit von Regex-Quell-Strings, ich mag einige Gründe / Konzepte von "x"*50000 von Überlauf-Handler, aber nicht auf ".*?x"*50000 .

Es macht keinen Sinn für mich, das ist warum.

Es ist etwas fehlt bei Überlauf-Checking oder seine nur gut oder seine wirklich überfüllt etwas?

Irgendwelche Hinweise / Meinungen werden geschätzt.

2 Solutions collect form web for “Python's Regular Expression Quelle String Länge”

Der Unterschied ist, dass ".*?.*?.*?.*?.*?.*?.*?.*?.*?.*?"*50000 kann auf ".*?" Reduziert werden ".*?" , Während "x"*50000 50000 Knoten in der FSM erzeugen muss (oder eine ähnliche Struktur, die von der Regex-Engine verwendet wird).

EDIT: Ok, ich war falsch Es ist nicht so schlau. Der Grund, warum "x"*50000 scheitert, aber ".*?x"*50000 ist nicht, dass es eine Grenze für die Größe eines "Code-Artikels" gibt. "x"*50000 wird ein langes Einzelteil generieren und ".*?x"*50000 erzeugt viele kleine Einzelteile. Wenn du das String-Literal irgendwie spalten könntest, ohne die Bedeutung der Regex zu ändern, würde es funktionieren, aber ich kann nicht an einen Weg denken, das zu tun.

Sie wollen 50000 "x" s passen, richtig ??? Wenn ja, eine Alternative ohne Regex

 if "x"*50000 in mystring: print "found" 

Wenn du 50000 "x" s mit regex anpassen möchtest, kannst du den Bereich verwenden

 >>> pat=re.compile("x{50000}") >>> pat.search(s) <_sre.SRE_Match object at 0xb8057a30> 

Auf meinem System wird es in der Länge von 65535 max nehmen

 >>> pat=re.compile("x{65536}") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/re.py", line 188, in compile return _compile(pattern, flags) File "/usr/lib/python2.6/re.py", line 241, in _compile p = sre_compile.compile(pattern, flags) File "/usr/lib/python2.6/sre_compile.py", line 529, in compile groupindex, indexgroup RuntimeError: invalid SRE code >>> pat=re.compile("x{65535}") >>> 

Ich weiß nicht, ob es in Python Tweaks gibt, die wir verwenden können, um diese Grenze zu erhöhen.

  • PYTHON REGEXP ersetzt das erkannte Muster mit dem Muster selbst und dem Ersatz?
  • Python reguläre Ausdrücke
  • Regex, um bestimmte IPs einzuschließen und auszuschließen
  • Rückkehr von einzigartigen Streichhölzern mit Regex in Python
  • So finden Sie Termine im Satz mit NLP, RegEx in Python
  • Regulärer Ausdruck: Spielstart oder Whitespace
  • Grep und Python
  • Warum ist Python re.search Hinzufügen von Leerzeichen zu meinem String?
  • Konfiguriere Django URLS.py, um #anchors in URL zu behalten, nachdem es es mit einem Ende /
  • Mit regex suchen, bis gewünschte Muster
  • Reguläre Ausdrücke, aber für das Schreiben in das Spiel
  • Python ist die beste Programmiersprache der Welt.