2017-01-25 9 views
2

Ich kann das nicht für das Leben von mir herausfinden. Python 2.7.Erstellen einer Regex zum Erkennen von Wörterbüchern

Ich habe eine Konfigurationsdatei, die so etwas wie

ist
define something { 
    var val1 
    var val2 
} 

define something_else { 
    var val3 
    var val4} 
... 

und ich möchte jedes „Objekt“ von Start entsprechen „definieren.“ Was ich tun möchte, ist grundsätzlich eines dieser gesamten Objekte aus einer Datei zu löschen, wenn eine Sequenz innerhalb des Objekts auftritt.

Bisher habe ich

re.compile(r"(define.+\{\n)((.*\n)*)(\})")

aber das passt alles bis zum letzten Index und wird nicht entsprechen den } Charakter.

Ich habe auch versucht re.compile(r"(define.+\{\n)((\s*\S*)*)(\})"), aber das scheint auch nicht zu funktionieren. Aus irgendeinem Grund packt die Regex alles und wird die schließende Klammer überhaupt nicht fangen.

Mir ist klar, dass eine Linie mit nur einem Schließbügel entweder

\n} oder } oder (some number of spaces) } oder var valx (some number of spaces) }

sein könnte, aber ich glaube nicht, dass Materie sollte.

Auch die Konfigurationsdateien sind vorgeprüft, um sicherzustellen, dass die var/val-Syntax korrekt ist.

Antwort

4

Sie müssen die + Qualifier sagen, in einer nicht-gierige Weise zu verhalten und sich nur auf die erste passende } gehen:

re.findall(r'define [^{]+{[^}]+?}', data) 
# ['define something {\n var val1\n var val2\n}', 
# 'define something_else {\n var val3\n var val4}'] 
+1

ah, 'Hinzufügen? nachdem der Qualifier das Match in nicht-gieriger oder minimaler Weise durchgeführt hat; so wenige Zeichen wie möglich werden übereinstimmen. Habe das nicht zu meinem Vorteil genutzt. Auch zu sehen, wie du meinen passenden Ausdruck minimiert hast, half. Vielen Dank! – frei

Verwandte Themen