2016-07-11 22 views
1

ich in Python zu schreiben und lassen Sie uns sagen, ich habe eine Datei wie folgt aussehen:Python Regex geschweiften Klammern mehrzeilige

aaa 

aaa "word" --sdsdrrr2 --sds { 

test test 
} 

aaa "word2" --sdsdd sdsd { 

    fffsd 
    ssss 
} 

aaa "word3" -sdksdld sdsd 

{ 

    sdsdd 
    sdsddd 
    sdsdddd } 

jetzt will ich Ausgang für „word2“ einschließlich Präfix und Suffix analysieren, so ausgegeben wird sein:

aaa "word2" --sdsdd sdsd { 

    fffsd 
    ssss 
} 

versucht, den folgenden Code:

f = open('/tmp/testt2') 

for res in re.findall('aaa "word2" (.*?)}', f.read(), re.S): 
    print res                         

nur einige der Treffer Tipp ohne die zu sein Entkörnen und das Ende lockig.

Bitte beachten Sie:

  • Anzahl der Linien zwischen den geschweiften Klammern ist nicht bekannt.
  • Regex ist ein Muss
  • Curly Klammern Positionen sind auch unbekannt (kann Abstand sein oder nicht, neue Zeile oder nicht usw.) wie in dem oben genannten Beispiel.

Vielen Dank für jede Hilfe,

+0

Wenn Sie diese Regex kopieren, fehlt Ihnen die Öffnung '{'. Außerdem brauchen Sie [DOTALL] (https://docs.python.org/2/library/re.html#re.DOTALL) – RedX

+0

Ich bin mir nicht sicher, aber wenn Sie den ganzen Wert brauchen, warum verwenden Sie eine einfangende Gruppe? Verwenden Sie 'aaa" word2 ". *?}' –

Antwort

0

Sie können tun es:

^(?=.*"word2") #^- start of the line with pos. lookahead 
[^{]+  # anything not a { 
{[^}]+}  # followed by {, anything in between and a closing } 

Siehe a demo on regex101.com sowie a working fiddle on ideone.com.

+0

funktioniert für Word2/3, aber wenn ich "Wort" will, gibt es alles zurück. – NoamD

+0

@NoamD: Setzen Sie doppelte Anführungszeichen um das Wort. – Jan

+0

'^ (? =. *" Wort ") [^ {] + {[^}] +}' Ich denke, das ist genug. – bhansa