2012-10-09 18 views
6

Ho un file strutturato come questo:multilinea python regex

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

Sto cercando di trovare l'espressione regolare che dividere il mio file in questo modo:

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

Finora, ho finito con il seguente:

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

Il testo multilinea non viene catturato. Credo sia perché la qualificazione è davvero pigro pigro e prendere nulla, ma lo prendo fuori, la regex diventa davvero goloso:

>>>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')] 

Se uno ha un'idea? Grazie !

+1

Benvenuti a StackOverflow! Questo è un esempio di una domanda davvero buona - specifiche complete, codice riproducibile, un'analisi accurata del problema - fantastico! –

risposta

2

Si potrebbe dire l'espressione regolare per fermare corrispondenti alla riga successiva che inizia con A: (o alla fine della stringa):

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

Funziona alla grande! Grazie ! – jmague

+5

@ user1731620 Non dimenticare di "accettare" la risposta che ti aiuta. – kreativitea

+0

@jmague Non dimenticare di "accettare" la risposta che ti aiuta. –