2012-10-09 12 views
6

Tengo un archivo estructurado así:de líneas múltiples expresiones regulares pitón

A: some text 
B: more text 
even more text 
on several lines 
A: and we start again 
B: more text 
more 
multiline text 

Estoy tratando de encontrar la expresión regular que va a dividir mi archivo de la siguiente manera:

>>>re.findall(regex,f.read()) 
[('some text','more text','even more text\non several lines'), 
('and we start again','more text', 'more\nmultiline text')] 

Hasta el momento, no tengo terminó con lo siguiente:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*?)',f.read(),re.DOTALL) 
[(' some text', ' more text', ''), (' and we start again', ' more text', '')] 

El texto multilínea no está atrapado. Supongo que es debido a que el calificador perezoso es muy vago y coger nada, pero me lo saco, la expresión regular se pone muy codicioso:

>>>re.findall('A:(.*?)\nB:(.*?)\n(.*)',f.read(),re.DOTALL) 
[(' some text', 
' more text', 
'even more text\non several lines\nA: and we start again\nB: more text\nmore\nmultiline text')] 

¿Alguien tiene una idea? Gracias !

+1

Bienvenido a Stackoverflow! Este es un ejemplo de una pregunta realmente buena: especificaciones completas, código reproducible, un análisis preciso del problema, ¡excelente! –

Respuesta

2

Se podría decir que la expresión regular para detener a juego en la próxima línea que comienza con A: (o al final de la cadena):

re.findall(r'A:(.*?)\nB:(.*?)\n(.*?)(?=^A:|\Z)', f.read(), re.DOTALL|re.MULTILINE) 
+0

¡Funciona muy bien! Gracias ! – jmague

+5

@ user1731620 No olvides 'aceptar' la respuesta que te ayuda. – kreativitea

+0

@jmague No olvides 'aceptar' la respuesta que te ayuda. –

Cuestiones relacionadas