2010-08-20 4 views
11

Ich weiß, dass zum Parsen ich idealerweise alle Leerzeichen und Zeilenumbrüche entfernen sollte, aber ich tat dies nur als eine schnelle Lösung für etwas, was ich versuchte und ich kann nicht herausfinden, warum es nicht funktioniert .. Ich habe verschiedene Bereiche des Textes eingewickelt in meinem Dokument mit den Wrappern wie "#### 1" und versuche, auf dieser Grundlage zu analysieren, aber es funktioniert einfach nicht, egal was ich versuche, ich denke, ich verwende mehrzeilig korrekt .. jeder Rat wird geschätztPython Regex, passendes Muster über mehrere Zeilen .. warum funktioniert das nicht?

Dies liefert keine Ergebnisse überhaupt:

string=' 
####1 
ttteest 
####1 
ttttteeeestt 

####2 

ttest 
####2' 

import re 
pattern = '.*?####(.*?)####' 
returnmatch = re.compile(pattern, re.MULTILINE).findall(string) 
return returnmatch 
+1

Es wird nicht Zeit ausgeführt werden, da Sie nicht mehrzeiligen String Symbole ' '' '' oder ' """ ' –

+0

ok mit, verpasste ich dieses Konzept dann werde ich durch die re-dokumentation graben, um zu finden, wo es das erwähnt .. danke – Rick

+3

Deine Zuweisung zu 'string' ist ein Syntaxfehler. Meinst Du' ''' '? – msw

Antwort

12

Versuchen re.findall(r"####(.*?)\s(.*?)\s####", string, re.DOTALL) (funktioniert mit re.compile natürlich auch).

Diese Regexp wird Tupel zurückgeben, die die Nummer des Abschnitts und den Abschnitt Inhalt enthalten.

Für Ihr Beispiel wird [('1', 'ttteest'), ('2', ' \n\nttest')] zurückgegeben.

(BTW: Ihr Beispiel wird nicht ausgeführt, für mehrzeilige Strings verwenden ''' oder """)

+0

Dank, das funktioniert – Rick

19

mehrzeilige nicht . bedeutet Linie Rückkehr übereinstimmen, bedeutet dies, dass ^ und $ auf Linien nur begrenzt

re.M re.MULTILINE

Wenn angegeben, das Muster Zeichen '^' steht am Anfang des Strings und bei der> begi nning jeder Zeile (unmittelbar nach jedem Zeilenumbruch); und das Musterzeichen '$'> stimmt am Ende der Zeichenfolge und am Ende jeder Zeile überein (unmittelbar vor jedem> Zeilenende). Standardmäßig stimmt '^' nur am Anfang des Strings und '$' nur am Ende des Strings und unmittelbar vor dem Newline-String (falls vorhanden) am Ende des Strings überein.

re.S oder re.DOTALL macht . Spiel sogar neue Linien.

Quelle

http://docs.python.org/