Die Zeichenfolge wird in Kommas getrennt, außer in Klammern

8

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?

    
Nico Schlömer 07.11.2014, 19:44
quelle

3 Antworten

10

Schreiben Sie Ihre eigene benutzerdefinierte Split-Funktion:

%Vor%     
deets 07.11.2014, 19:52
quelle
5

Sie können in diesem Fall re.split verwenden:

%Vor%

Im Folgenden finden Sie eine Erklärung, was das Regex-Muster betrifft:

%Vor%     
iCodez 07.11.2014 20:00
quelle
2

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:

%Vor%     
Wiktor Stribiżew 31.03.2016 08:00
quelle

Tags und Links