Bester Weg Werte zwischen " " zu erhalten

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
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Einen Parser bauen? Wie genau?
Und eventuell wären Reguläre Ausdrücke dann doch gar nicht soo unpraktisch...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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']
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Ansonsten gibt es ja noch pyparsing, was allerdings wahrscheinlich ein bisschen overkill ist.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

a = "download a b c"
print a.split(" ", 1)
Stefan
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Das shlex Modul sieht großartig aus, danke sehr!
Antworten