Domanda

Sto cercando di usare una regex in Python per abbinare un file (salvato come una stringa, vale a dire "/volumes/footage/foo/bar.mov") per un file di log creo che contiene un elenco di file. Ma quando ho eseguito lo script, mi dà questo errore: sre_constants.error: unbalanced parenthesis. Il codice che sto utilizzando è questo:

Per leggere il file:

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()

Poi all'interno di un ciclo for I riassegnare (non mi rendevo conto che stavo facendo questo fino a quando ho postato questa domanda) la variabile the_file come una stringa da un elenco di file (ottenuto mediante l'esecuzione attraverso una cartella ed è sottoinsiemi e afferrando tutto i nomi dei file), quindi provare a usare espressioni regolari per vedere se il nome del file che è presente nel file di registro:

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

Ogni volta che colpisce la parte re.compile() del codice sputa fuori quell'errore. E se cerco di tagliare che fuori, e utilizzare re.search(the_file, the_log) sputa ancora fuori quell'errore. Non capisco come potrei essere sempre tra parentesi non bilanciata da questo.

È stato utile?

Soluzione

Gordon,

sembrerebbe a me che il problema è nei dati. Si sta compilando le stringhe ispezionati dal filelist in regexp, non badare che essi possano contenere caratteri meta rilevanti per il motore regexp.

Nel vostro ciclo for, aggiungere un print the_file prima della chiamata a re.compile (non è un problema che si sta riutilizzando un nome come l'iteratore ciclo che di cui al file oggetto prima), in modo da poter vedere quali sono le stringhe in realtà proveniente dal filelist. O, meglio ancora, eseguire tutte le istanze di the_file attraverso re.escape prima di passarli a re.compile. Questo si trasformerà tutti i caratteri meta nel loro equivalente normale.

Altri suggerimenti

Dove è il modello di espressione regolare? Stai cercando di utilizzare i nomi dei file contenuti in un unico file come modelli per cercare l'altro file? Se è così, si vuole fare un passo attraverso the_file con someting come

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

Python documentazione re.compile , il primo argomento di re.compile() dovrebbe essere il modello di espressione regolare come stringa.

Ma il valore di ritorno di open() è un oggetto file, che si assegna a the_file e passa alla re.compile() ....

Quello che stai legandosi a nome the_file nel tuo primo frammento è un oggetto file , anche se si dice che è "salvato come stringa", il nome del file (cioè la stringa) in realtà si chiama theLogFile ma ciò che si sta cercando t trasformarsi in un oggetto RE è non theLogFile (stringa), è the_file (l'oggetto file ora-chiuso). Detto questo, l'errore di un po 'eccentrico (ci si aspetterebbe un TypeError), ma è chiaro che si un errore a re.compile.

the_file deve essere una stringa. Nel the_file codice di cui sopra è il valore di ritorno aperta, che è un oggetto file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top