strings "spezieller" teilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo, ich habe einige Monate im Prinzip nichts mit Python gemacht. Ich habe folgendes Problem.

Wie kann ich elegant einen String teilen (nach spaces, aber NUR wenn das space nicht in Anführungszeichen ist.
Bsp
string= mystring "this is a line" test

string.split(' ') teilt mir das auf auf ['mystring', "this" "is", "a" line"... "test"

was ich möchte ist
["mystring", "this is a line", ["test"]

gibt es da einen kurzen Weg, dies zu erreichen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Francesco, willkommen zurück,

Du könntest den CSV-Parser verwenden und als Separator einfach das Leerzeichen angeben :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Leonidas hat geschrieben:Hallo Francesco, willkommen zurück,

Du könntest den CSV-Parser verwenden und als Separator einfach das Leerzeichen angeben :)
Danke Leonidas. Ich wundere mich nur, ob es kein regex split gibt. Ich bildete mir ein, das ging irgendwie. Nachtrag: Nein, in diesem Fall wird das nicht funktionieren. das mit dem csv Parser ist ein guter Tip.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Francesco hat geschrieben:Ich wundere mich nur, ob es kein regex split gibt. Ich bildete mir ein, das ging irgendwie. Nachtrag: Nein, in diesem Fall wird das nicht funktionieren.
Ich wollte auch gerade einwenden: ``re.split`` existiert zwar, aber wie willst du feststellen ob du in einem gequoteten Bereich bist?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Leonidas hat geschrieben:
Francesco hat geschrieben:Ich wundere mich nur, ob es kein regex split gibt. Ich bildete mir ein, das ging irgendwie. Nachtrag: Nein, in diesem Fall wird das nicht funktionieren.
Ich wollte auch gerade einwenden: ``re.split`` existiert zwar, aber wie willst du feststellen ob du in einem gequoteten Bereich bist?
Ja, genau. Der Hintergrund des ganzen ist pyxfce. Aber die Frage passt hier nicht ganz herein. Ich werde einen neuen Thread in Ideen eröffnen (pyxfce Grafische Oberfläche Linux).
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Ich hatte mal kurz so was probiert:

Code: Alles auswählen

string= 'mystring "this is a line" test'
print map(str.strip,string.split('"'))
Sollte es vielleicht auch tun?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Funktioniert aber auch nur bei diesem Sonderfall. Das ist keine allgemeingültige Lösung:

Code: Alles auswählen

In [26]: string= 'mystring and a test "this is a line" test test test'

In [27]: print map(str.strip,string.split('"'))
['mystring and a test', 'this is a line', 'test test test']
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Genau für so etwas wurde shlex.split() erfunden.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde es so machen:

Code: Alles auswählen

import re
s = 'mystring "this is a line" test' 
print re.findall(r'"[^"]*"|\S+', s)
Stefan

PS: sollen die " noch weg, ginge dies:

Code: Alles auswählen

print [s.strip('"') for s in re.findall(r'"[^"]*"|\S+', s)]
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

sma hat geschrieben:Ich würde es so machen:

Code: Alles auswählen

import re
s = 'mystring "this is a line" test' 
print re.findall(r'"[^"]*"|\S+', s)
Stefan

PS: sollen die " noch weg, ginge dies:

Code: Alles auswählen

print [s.strip('"') for s in re.findall(r'"[^"]*"|\S+', s)]
Dankeschön! ;)
Antworten