Python Regex in einer Liste von Dateien, eine Datei entsprechen (immer Fehler)

StackOverflow https://stackoverflow.com/questions/2344193

  •  23-09-2019
  •  | 
  •  

Frage

Ich versuche, einen regulären Ausdruck in Python zu verwenden, um eine Datei zu entsprechen (als Zeichenfolge gespeichert, das heißt „/volumes/footage/foo/bar.mov“) in eine Protokolldatei erstelle ich, dass eine Liste von Dateien enthält. Aber wenn ich das Skript ausführen, es gibt mir diese Fehlermeldung: sre_constants.error: unbalanced parenthesis. Der Code ich verwende, ist dies:

Um die Datei zu lesen:

theLogFile = The_Root_Path + ".processedlog"
if os.path.isfile(theLogFile):
        the_file = open(theLogFile, "r")
    else:
        open(theLogFile, 'w').close()
        the_file = open(theLogFile, "r")
    the_log = the_file.read()
    the_file.close()

Dann in einer for Schleife I neu zuweisen (ich wusste nicht, dass ich tat dies, bis ich diese Frage gestellt), um die the_file Variable als String aus einer Liste von Dateien (erhalten, indem sie durch einen Ordner ausgeführt wird und es die Untergruppen und greifen alle die Dateinamen), dann versuchen Regex zu verwenden, um festzustellen, ob der Dateiname in der Protokolldatei ist:

for the_file in filenamelist:
    p = re.compile(the_file, re.IGNORECASE)
    m = p.search(the_log)

Jedes Mal trifft es den re.compile() Teil des Codes es ausspuckt, dass Fehler. Und wenn ich versuche, das zu schneiden, und die Verwendung re.search(the_file, the_log) spuckt nach wie vor, dass Fehler aus. Ich verstehe nicht, wie ich unausgeglichen Klammer von diesem bekommen werden.

War es hilfreich?

Lösung

Gordon,

würde es mir scheint, dass das Problem in den Daten vorhanden ist. Sie kompilieren ungeöffnet Strings aus der filelist in regexp, nicht beachtend, dass sie Meta-Zeichen relevant für den regexp Motor enthalten könnten.

Ihre for-Schleife, eine print the_file vor dem Aufruf von re.compile hinzufügen (es ist kein Problem, dass Sie wieder mit einem Namen wie die Schleife Iterator werden, die vor dem Dateiobjekt bezeichnet), so können Sie sehen, welche Saiten tatsächlich kommt aus der Dateiliste. Oder noch besser, laufen alle Instanzen the_file durch re.escape, bevor sie an re.compile vorbei. Dadurch werden alle Meta-Zeichen in ihre normale Äquivalent drehen.

Andere Tipps

Wo ist das Muster für reguläre Ausdrücke? Versuchen Sie, die Dateinamen in einer Datei enthalten sind, zu verwenden als Muster die andere Datei zu suchen? Wenn ja, werden Sie wollen Schritt für Schritt durch the_file mit someting wie

for the_pattern in the_file:
    p = re.compile(the_pattern, re.IGNORECASE)
    m = p.search(the_log)
    ...

Nach den Python re.compile Dokumentation , das erste Argument re.compile() sollte das Muster eines regulären Ausdrucks als Zeichenkette sein.

Aber der Rückgabewert von open() ist ein Dateiobjekt, mit dem Sie the_file zuweisen und re.compile() passieren ....

Was Sie Namen the_file in Ihrem ersten Schnipsel sind verbindlich ist ein Dateiobjekt , auch wenn Sie feststellen, dass die sagen, „als String gespeichert“, den Dateinamen (dh die Zeichenfolge) tatsächlich genannt theLogFile aber was Sie versuchen t wiederum in ein RE-Objekt ist nicht theLogFile (die Zeichenkette), es ist the_file (das jetzt geschlossene Datei-Objekt). Angesichts dieser Tatsache ist der Fehler etwas schrulligen (man würde eine TypeError erwarten), aber es ist klar, dass Sie einen Fehler bei re.compile.

the_file sollte ein String sein. In dem obigen Code the_file ist der Rückgabewert der offenen, der ein Dateiobjekt ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top