2010-09-17 23 views
8

tengo la siguiente expresión regular:Python RegEx Coincidencia de nueva línea

[0-9]{8}.*\n.*\n.*\n.*\n.* 

que fueron comprobadas en Expresso con el archivo que estoy trabajando y el partido es acertada.

que desea hacer coincidir la siguiente:

  • Referencia 8 números largos
  • cualquier carácter, cualquier número de veces
  • nueva línea
  • Cualquier carácter, cualquier número de veces
  • Nueva línea
  • Cualquier carácter, cualquier número de veces
  • N ew Línea
  • Cualquier carácter, cualquier número de veces
  • nueva línea
  • Cualquier carácter, cualquier número de veces

Mi código Python es:

for m in re.findall('[0-9]{8}.*\n.*\n.*\n.*\n.*', l, re.DOTALL): 
     print m 

Pero se producen coincidencias , como se dijo en Expresso, hay más de 400 partidos, que es lo que esperaría.

¿Qué es lo que falta aquí?

Respuesta

12

No utilice re.DOTALL o el punto también coincidirá con las líneas nuevas. También utilizar cuerdas primas (r"...") para expresiones regulares:

for m in re.findall(r'[0-9]{8}.*\n.*\n.*\n.*\n.*', l): 
    print m 

Sin embargo, la versión todavía debería haber trabajado (aunque muy ineficientemente) si que ha leído todo el archivo en formato binario en la memoria como una gran cadena de.

Así que la pregunta es, ¿está usted de leer el archivo de la siguiente manera:

with open("filename","rb") as myfile: 
    mydata = myfile.read() 
    for m in re.findall(r'[0-9]{8}.*\n.*\n.*\n.*\n.*', mydata): 
     print m 

O trabajan con líneas individuales (for line in myfile: o myfile.readlines())? En ese caso, la expresión regular no puede funcionar, por supuesto.

+0

Hola, sí, estoy ejecutando Python en Windows pero el archivo es de un entorno Unix. – humira

+1

Es poco probable que el origen del archivo sea importante. La pregunta era si estaba abriendo todo el archivo de una vez o usando un iterador. Los iteradores de Python iterarán sobre los nuevos caracteres de línea. –