Erklärung für eine regular Expression gesucht

Yagharek

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
282
Hallo

ich habe das Problem, dass ich in Python ein String mit folgendem Aufbau
"Variabel Label1 Label2 'Ganz toller Label' Label3"
in folgende Liste aufsplitten möchte:
['Variabel','Label1 ','Label2 ','Ganz toller Label', 'Label3']

gefunden habe ich im Internet folgende Lösung: re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', s) (Muss dabei " mit ' ersetzen)
http://stackoverflow.com/questions/16710076/python-split-a-string-respect-and-preserve-quotes

Mein Problem ist, ich verstehe nicht, wie diese regular Expression funktioniert. Ich bin dahinter gekommen, dass "(?:" eine "non capturing Group" ist, verstehe aber nicht, was sie genau in obigen Fall macht.

aber ich verstehe nicht genau, wie diese Arbeitet. Kann mir hier jemand erklären, wie genau diese regular Expression Wörter in nicht Hochkommata und Bereiche in Hochkommata findet?
 
Also für mich sieht das so aus als wolltest du mit Kanonen auf Spatzen schießen. Meiner Meinung nach braucht es hierfür keine regular expressions. Nehm einfach einen csv-Parser mit den Einstellungen Leerzeichen und single quote. Das sollte dir auch das von dir genannte Ergebnis liefern und obendrein auch noch schneller sein.
 
Mag sein, dass es andere Programme gibt, die das auch und besser können. Nur derzeit arbeite ich mit Python und mein Skript enthält ein bisschen mehr, als nur die Verwendung der obigen regular Expression. Mir geht es darum, zu verstehen, was diese macht.
 
@ Umbel

Der Link ist super. Das Tool hätte ich schon des öfteren gebrauchen können.

@Yagharek

Wie du vielleicht nun selber herausfinden kannst, handelt es sich bei non capturing groups um gewöhnliche Gruppen, welche aber nicht referenzierbar sind. In deinem Fall sollte es egal sein, ob du nun eine capturing, oder eine non-capturing Group verwendest.
 
@Umbel

danke für den Link. Leider scheint er bei mir auf der Arbeit nicht richtig zu laufen, finde kein Möglichkeit, die regex einzugeben. Ist aber normal bei unseren Einschränkungen hier. Werde es heute abend testen.

@schattenhueter
das ist auch meine Überlegung, aber wenn ich das "?:" wegnehme, geht es nichtmehr.


Ich habe weiter gesucht, ich verwende jetzt das Python "shlex" Modul. Das kann auch ein String trennen und die Hochkommata berücksichtigen.
 
Dass es nicht geht, dürfte daran liegen, dass der Return Type ein anderer ist, wenn die Gruppe gecaptured wird.

Aus der Python-Dokumentation:
Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result unless they touch the beginning of another match.
 
Zurück
Oben