Seite 1 von 1

Bester Weg Werte zwischen " " zu erhalten

Verfasst: Dienstag 21. Oktober 2008, 17:54
von Crazed
Hallo,
Ich suche den intelligentesten Weg (am besten ohne RegExp) die Werte zwischen " " zu erhalten. Das hat wieder mit meinem IRC Projekt zu tun.

Angenommen ich habe die funktion "!download" und will folgendes machen:
!download http://www.webserver.de/file.fil C:\Program Files\Ordner mit Leerstelle\Haha
Habe ich ein Problem weil ich momentan die Argumente mit .split() erhalte.
Splitte ich mit split(") ist jeder 2te Spalte in der Liste ein Wert. Aber das kann sich ändern wenn z.b kein Wert in einem "" übergeben wird oder die Leerstellen unterschiedlich sind (glaube ich)

Hat jemand eine Idee?

Crazed

Verfasst: Dienstag 21. Oktober 2008, 18:10
von Leonidas
Ohne Reguläre Ausdrücke kannst du entweder einen Parser bauen oder den String nach Anführungszeichen Scannen. Scannen funktioniert aber nur dann halbwegs Ok, wenn im Dateinamen keine Anführungszeichen sind, dann müsste man sie Escapen und Simples scannen wird dann etwas ätzend.

Verfasst: Dienstag 21. Oktober 2008, 18:18
von Crazed
Einen Parser bauen? Wie genau?
Und eventuell wären Reguläre Ausdrücke dann doch gar nicht soo unpraktisch...

Verfasst: Dienstag 21. Oktober 2008, 18:55
von Leonidas
Crazed hat geschrieben:Einen Parser bauen? Wie genau?
Nun, du kannst entweder eine (E)BNF-ähnliche Grammatik erstellen und mit einem Parsergenerator einen Parser bauen lassen (vergleichsweise aufwendig, macht man vor allem bei Programmiersprachen) oder, was zum toleranten Parsen von Eingaben etwas sinnvoller ist, einen ad-hoc-Parser wie Pyparsing verwenden.

Verfasst: Dienstag 21. Oktober 2008, 19:11
von BlackJack
Eventuell ist auch das `shlex`-Modul für diese Aufgabe geeignet.

Code: Alles auswählen

In [519]: shlex.split('!download http://www.webserver.de/file.fil "C:\Program Files\Ordner mit Leerstelle\Haha"')
Out[519]:
['!download',
 'http://www.webserver.de/file.fil',
 'C:\\Program Files\\Ordner mit Leerstelle\\Haha']

Verfasst: Dienstag 21. Oktober 2008, 20:45
von Sr4l

Code: Alles auswählen

>>>'!download http://www.webserver.de/file.fil "C:\Program Files\Ordner mit Leerstelle\Haha"'.split(" ", 2)
['!download', 'http://www.webserver.de/file.fil', '"C:\\Program Files\\Ordner mit Leerstelle\\Haha"']
Wobei das Modul von BlackJack ein bessere Fehlerbehandlung haben wird.

Verfasst: Dienstag 21. Oktober 2008, 22:06
von Leonidas
Ich würde wohl auch zuerst einmal BlackJacks Tipp ansehen, denn es ist ja gut möglich, dass der Parser dort schon ausreichend brauchbar und allgemeint ist.

Verfasst: Dienstag 21. Oktober 2008, 22:22
von lunar
Ansonsten gibt es ja noch pyparsing, was allerdings wahrscheinlich ein bisschen overkill ist.

Verfasst: Mittwoch 22. Oktober 2008, 08:31
von sma

Code: Alles auswählen

a = "download a b c"
print a.split(" ", 1)
Stefan

Verfasst: Mittwoch 22. Oktober 2008, 12:08
von Crazed
Das shlex Modul sieht großartig aus, danke sehr!