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

Dienstag 21. Oktober 2008, 17:54

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 18:10

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

Dienstag 21. Oktober 2008, 18:18

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

Dienstag 21. Oktober 2008, 18:55

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 Modvoice
BlackJack

Dienstag 21. Oktober 2008, 19:11

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:

Dienstag 21. Oktober 2008, 20:45

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. Oktober 2008, 22:06

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 Modvoice
lunar

Dienstag 21. Oktober 2008, 22:22

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

Mittwoch 22. Oktober 2008, 08:31

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

Mittwoch 22. Oktober 2008, 12:08

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