Python expresión regular para que coincida con un archivo en una lista de archivos (que consigue error)

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

  •  23-09-2019
  •  | 
  •  

Pregunta

Estoy tratando de utilizar una expresión regular en Python para que coincida con un archivo (guardado como una cadena, es decir, "/volumes/footage/foo/bar.mov") a un archivo de registro se crea que contiene una lista de archivos. Pero cuando corro el guión, me da este error: sre_constants.error: unbalanced parenthesis. El código que estoy usando es el siguiente:

Para leer el archivo:

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

A continuación, dentro de un bucle for reasigno (no me di cuenta que estaba haciendo esto hasta que he publicado esta pregunta) la variable the_file como una cadena de una lista de archivos (obtenido mediante la ejecución a través de una carpeta y de subconjuntos y agarrando todo los nombres de archivo), entonces tratan de usar expresiones regulares para ver si ese nombre de archivo está presente en el archivo de registro:

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

Cada vez que golpea la parte re.compile() del código escupe ese error. Y si trato de cortar eso, y el uso re.search(the_file, the_log) todavía escupe ese error. No entiendo cómo pude estar recibiendo paréntesis desequilibrada de esta.

¿Fue útil?

Solución

Gordon,

Me parece que el problema está en los datos. Está compilando cadenas no inspeccionadas desde el filelist en expresión regular, no prestar atención a que pudieran contener caracteres meta relevante para el motor de expresiones regulares.

En el bucle, añadir un print the_file antes de la llamada a re.compile (no es un problema que se está reutilizando un nombre que el iterador bucle que hace referencia a objeto de archivo antes), por lo que se puede ver que las series se en realidad viene de la lista de archivos. O, mejor aún, ejecutar todas las instancias de the_file través re.escape antes de pasarlos a re.compile. Esto a su vez todos los meta caracteres en su equivalente normal.

Otros consejos

¿Dónde está el patrón de expresión regular? ¿Estás tratando de utilizar nombres de archivos contenidos en un archivo como patrones para buscar otro archivo? Si es así, tendrá que paso a través the_file con calle detrás como

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

De acuerdo con la documentación de Python re.compile , el primer argumento re.compile() debe ser el patrón de expresión regular como una cadena.

Sin embargo, el valor de retorno de open() es un objeto de archivo, que se asigna a the_file y pasar a re.compile() ....

Lo que estás unión a nombre the_file en su primer fragmento es un objeto de archivo , a pesar de que se dice que es "guardados como una cadena", el nombre del archivo theLogFile (es decir, la cadena) es en realidad el nombre pero lo que estamos tratando t su vez en un objeto RE es no theLogFile (la cadena), es the_file (el objeto archivo ahora-cerrado). Ante esto, el error es un tanto peculiar (cabría esperar una TypeError), pero está claro que obtener un error en re.compile.

the_file debería ser una cadena. En el the_file código anterior es el valor de retorno de abierto, que es un objeto de archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top