Python re.findall - Abfrage dauert zu lange

dieterz1

Ensign
Registriert
Jan. 2014
Beiträge
245
Hallo,
ich muss aus einem Text, der aus ca. 20 000 Zeichen besteht, bestimmte Passagen herausfiltern.
Mein Code lautet wie folgt:

Python:
re.findall("<htmlCode>(regulärerAusdruck1)</htmlCode>.*<htmlCode>(regulärerAusdruck2)</htmlCode>.*<htmlCode>(regulärerAusdruck3)</htmlCode>",meineVariable)

Der Code funktioniert zwar, jedoch dauert die Abfrage mindestens 10 Sekunden!

Daher eine Frage an die Experten: gibt es einen anderen Weg, Rechnenleistung einzusparen?

Wenn die oben genannte Bedingung aus "regulärerAusdruck1", "regulärerAusdruck2" und "regulärerAusdruck3" erfüllt ist, kann die Abfrage eigentlich abgebrochen werden, da ich nur die erste Übereinstimmung auswerten muss.

Ich hab schon versucht die letzten 10 000 Zeichen "abzuschneiden", da die Bedingung im ersten Teil des Textes vorkommt, doch an der Performance hat sich NICHTS verbessert.

Wer kann mir ein paar Tipps geben?
 
in der aktuellen ix ist ein artikel über "explosive ausdrücke". die kombination von "greedy" quantoren in verbindung mit dem backtracking in langen suchstrings ist tödlich.

schau mal z.b. hier. da gibts auch einen abschnitt "Quickly Matching a Complete HTML File". das könnte bei dir passen.
 
  • Gefällt mir
Reaktionen: KillerCow
ok, ich muss meinen reg. Ausdruck konkretisieren.
Aber was muss ich tun, damit der Durchlauf nach der ersten Übereinstimmung abbricht?
 
je nachdem wie richtig oder falsch zu quantoren benutzt, ist das schon so.

mal geschaut, ob es vielleicht schneller laeuft, die 20KB in 'nen XML-parser zu kloppen und dann einen passenden selektor zu verwenden? HTML mit regulaeren ausdruecken zu durchsuchen ist eigentlich fast immer ein fehler. dass nur die performance mies ist, ist noch das geringste problem.
 
Kann mich jetzt auch täuschen, aber ich glaube re.search stoppt nach dem ersten Match.
 
Zurück
Oben