Ich möchte eine mehrzeilige Python-Zeichenfolge an ihren Kommas teilen, außer wenn die Kommas in einem geklammerten Ausdruck sind. Zum Beispiel die Zeichenfolge
%Vor%Sollte in
aufgeteilt sein %Vor% Das betrifft Bracket-Matching, also helfen hier wohl keine Regexes. PyParsing hat commaSeparatedList
was fast tut was ich brauche, außer dass zitierte ( "
) Umgebungen geschützt sind anstatt {}
-begrenzte.
Irgendwelche Hinweise?
Lucas Trzesniewski Kommentar kann tatsächlich in Python mit dem PyPi-Regex-Modul verwendet werden (ich habe die benannte Gruppe durch eine nummerierte ersetzt, um sie kürzer zu machen):
%Vor% Das Muster - ({(?:[^{}]++|\g<1>)*})(*SKIP)(*FAIL)
- entspricht {...{...{}...}...}
like Strukturen (als {
entspricht {
, (?:[^{}]++|\g<1>)*
entspricht 0+ Vorkommen von 2 Alternativen: 1) alle 1+ Zeichen außer {
und }
(der [^{}]++
), 2) Text, der dem gesamten ({(?:[^{}]++|\g<1>)*})
Untermuster entspricht). Die (*SKIP)(*FAIL)
Verben bewirken, dass die Engine den gesamten übereinstimmenden Wert aus dem Übereinstimmungspuffer auslässt und somit den Index an das Ende der Übereinstimmung bewegt und nichts zurückhält (wir "überspringen", was wir gefunden haben).
Das \s*,\s*
entspricht einem Komma, das mit 0+ Leerzeichen verknüpft ist.
Die None
-Werte werden angezeigt, weil im ersten Zweig eine Erfassungsgruppe vorhanden ist, die leer ist, wenn der zweite Zweig übereinstimmt. Wir müssen eine Capture-Gruppe im ersten alternativen Zweig für die Rekursion verwenden. Um die leeren Elemente zu entfernen, verwenden Sie Verständnis: