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

Bester Weg Werte zwischen " " zu erhalten

Beitragvon Crazed » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Beitragvon Crazed » 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...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Beitragvon 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:

Beitragvon Sr4l » 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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Beitragvon 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

Beitragvon sma » 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

Beitragvon Crazed » Mittwoch 22. Oktober 2008, 12:08

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder