2012-10-09 4 views
6

Ich habe eine Datei wie folgt strukturiert:mehrzeilige 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 

Ich versuche, die regex zu finden, die meine Datei wie folgt aufgeteilt werden:

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

weit Also, ich habe endete mit dem Folgenden:

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

Der mehrzeilige Text wird nicht abgefangen. Ich denke, weil die faule Qualifier wirklich faul ist und nichts fangen, aber ich nehme es aus, die Regex wirklich gierig bekommt:

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

Hat jemand eine Idee? Vielen Dank !

+1

Willkommen bei Stackoverflow! Dies ist ein Beispiel für eine wirklich gute Frage - komplette Spezifikationen, reproduzierbarer Code, eine genaue Analyse des Problems - großartig! –

Antwort

2

Sie können den regex sagen in der nächsten Zeile zu stoppen, die passenden (oder am Ende des Strings) mit A: beginnt:

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

Funktioniert gut! Vielen Dank ! – jmague

+5

@ user1731620 Vergessen Sie nicht, die Antwort zu akzeptieren, die Ihnen hilft. – kreativitea

+0

@jmague Vergessen Sie nicht, die Antwort zu akzeptieren, die Ihnen hilft. –