Seite 1 von 2
Parsing Hilfe...
Verfasst: Montag 8. Februar 2010, 11:24
von walha2006
ich brauche Hilfe bei Parsing :
ich wollte mit Python ein Skript (oder *.txt) öffnen und die Schlüssel Wörter (LOOPSTART ,SEND ,CONT....) suchen ,dann die Funktionen von diesen Schlüssel Wörter abrufen , soll ich pypython benutzen ?ich muss ein Grammatik erstellen oder ?
hier ein Bsp von diese Skripte :
LOOPSTART [TEST_FLASHMODE] COUNT [1]
DIAG [SET_ENERGIESPARMODE_NORMAL] SEND [31,01,0F,0C,00] EXPECT[71,01,0F,0C,*] TIMEOUT [0] SOURCE[F1] TARGET [10]
Re: Parsing Hilfe...
Verfasst: Montag 8. Februar 2010, 11:30
von Ronnie
walha2006 hat geschrieben:... ich muss ein Grammatik erstellen, oder?
Nein, das ist doch eine sehr simple Struktur. Du suchst ein Wort gefolgt von einer Folge von kommagetrennten Werten in eckigen Klammern. Da bieten sich verschiedene Wege an, z.B. die Zerlegung via regulärer Ausdrücke.
Re: Parsing Hilfe...
Verfasst: Montag 8. Februar 2010, 12:04
von walha2006
Ronnie hat geschrieben:walha2006 hat geschrieben:... ich muss ein Grammatik erstellen, oder?
Nein, das ist doch eine sehr simple Struktur. Du suchst ein Wort gefolgt von einer Folge von kommagetrennten Werten in eckigen Klammern. Da bieten sich verschiedene Wege an, z.B. die Zerlegung via regulärer Ausdrücke.
Danke Roonie ,aber kannst du mir vielleicht eine klein Beispiel geben...

Re: Parsing Hilfe...
Verfasst: Montag 8. Februar 2010, 12:18
von Ronnie
walha2006 hat geschrieben:Danke Ronnie ,aber kannst du mir vielleicht eine klein Beispiel geben...

okay, auch wenn ich empfehlen würde es eher schrittweise anzugehen, da ich eingestehen muss, dass der Gebrauch von ListComprehensions und Regex etwas maßlos ist
Code: Alles auswählen
config = """LOOPSTART [TEST_FLASHMODE]
COUNT [1]
DIAG [SET_ENERGIESPARMODE_NORMAL]
SEND [31,01,0F,0C,00]
EXPECT[71,01,0F,0C,*]
TIMEOUT [0]
SOURCE[F1]
TARGET [10]"""
table = dict( [(m[0], m[-1].split(',')) if re.match(r'[0-9A-F*]+,', m[-1]) else m for m in re.findall(r'(\w+)\s*\[(.+)\]', config)] )
table erlaubt dann den Zugriff auf die einzelnen Parameter über die Schlüsselwörter aus derKonfiguration.
Verfasst: Montag 8. Februar 2010, 15:19
von Hyperion
Die Frage ist noch, ob es zu Verschachtelungen kommen kann. Denn dann reicht ein einfacher RegExp nicht mehr aus.
Verfasst: Montag 8. Februar 2010, 16:40
von walha2006
Hyperion hat geschrieben:Die Frage ist noch, ob es zu Verschachtelungen kommen kann. Denn dann reicht ein einfacher RegExp nicht mehr aus.
ja ,Z.B bei SEND [31,01,0F,0C,00] ,ruft das Programm die Funktion Senden ab und er nimmt alle Variable "31,01,0F,0C,00" in diese Funktion an......

Verfasst: Montag 8. Februar 2010, 17:04
von derdon
Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Verfasst: Montag 8. Februar 2010, 17:32
von walha2006
derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Bitte einpaar Vorlschäge?

Verfasst: Montag 8. Februar 2010, 17:39
von Dav1d
Code: Alles auswählen
table = dict((m[0], m[-1].split(',')) if re.match(r'[0-9A-F*]+,', m[-1]) else m for m in re.findall(r'(\w+)\s*\[(.+)\]', config))
Verfasst: Montag 8. Februar 2010, 17:39
von Hyperion
walha2006 hat geschrieben:derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Bitte einpaar Vorlschäge?

Was stimmt denn nicht mit Ronnies Lösung?
Verfasst: Montag 8. Februar 2010, 18:02
von walha2006
Hyperion hat geschrieben:walha2006 hat geschrieben:derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Bitte einpaar Vorlschäge?

Was stimmt denn nicht mit Ronnies Lösung?
Die Lösung von Ronnie hat mir sehr geholfen ,aber z.b bei SEND ,ich muss Die Funktion senden( , , , ) aufrufen ,geht das vielleicht mit dem "matches" :
funcs = {'int':int, 'float':float, 'list': list}
for func,args in matches:
print funcs[func](eval(args))
Verfasst: Montag 8. Februar 2010, 18:07
von Hyperion
walha2006 hat geschrieben:Hyperion hat geschrieben:walha2006 hat geschrieben:derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Bitte einpaar Vorlschäge?

Was stimmt denn nicht mit Ronnies Lösung?
Die Lösung von Ronnie hat mir sehr geholfen ,aber z.b bei SEND ,ich muss Die Funktion senden( , , , ) aufrufen ,geht das vielleicht mit dem "matches" :
Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?
Verfasst: Montag 8. Februar 2010, 18:31
von walha2006
Hyperion hat geschrieben:Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?
ich habe einpaar skripte ,die ich mit Python parsen wollte ,und bei Schlüssel wörter ,Z.B SEND , SOURCE ,TARGET..... die geeignete Funktion aufrufen ...

Verfasst: Montag 8. Februar 2010, 19:01
von Hyperion
walha2006 hat geschrieben:Hyperion hat geschrieben:Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?
ich habe einpaar skripte ,die ich mit Python parsen wollte ,und bei Schlüssel wörter ,Z.B SEND , SOURCE ,TARGET..... die geeignete Funktion aufrufen ...

Ja und das kannste doch mit der Lösung?
Verfasst: Montag 8. Februar 2010, 19:58
von Dav1d
verwende ein dict.!
Code: Alles auswählen
handler = {'SENDEN' : self.send, 'ANDERE FUNC' : self.other_func}
self ggf. weglassen, für die Parameter =>
http://docs.python.org/tutorial/control ... ment-lists
while loop
Verfasst: Samstag 20. Februar 2010, 13:10
von LanX
Hi
Ich frage mich ob man statt dieser ListComprehension es mit ner While Schleife vereinfachen könnte...
Also in Perl würde ich folgendes schreiben
Code: Alles auswählen
$table{$1} = [ split /,/,$2 ] while ( $config =~ /(\w+)\s*\[(.*?)\]/g );
aber mir ist nicht klar wie ich das in Python so (dh. mit while über matches iterieren) abbilden könnte...
Grüße
rolf
EDIT: typo korrigiert
Verfasst: Samstag 20. Februar 2010, 15:22
von Ronnie
Hallo Rolf,
wieso willst du unbedingt eine while-Schleife verwenden, wenn sich doch ein for-in-Loop eher anbieten würde? Um die Frage aus deiner Mail zu beantworten, wenn du von der Regex einen Iterator möchtest, bietet sich re.finditer an.
Gruß,
Ronnie
Verfasst: Samstag 20. Februar 2010, 15:41
von LanX
Hi Ronnie
Ronnie hat geschrieben:
wieso willst du unbedingt eine while-Schleife verwenden, wenn sich doch ein for-in-Loop eher anbieten würde?
eine while schleife kann ich abbrechen wenn ich gefunden habe was ich suche, nach meinem Verständnis produziert for-in ja erst eine liste aller matches bevor durchsucht wird.
Bei einem langen configfile kann das unnötig lange dauern...
Oder sehe ich da etwas falsch, erzwingen die runden Klammern um die Comprehension dass auch alle Unterausdrücke nur noch lazy evaluiert werden?
bye
rolf
Verfasst: Samstag 20. Februar 2010, 15:56
von derdon
LanX hat geschrieben:eine while schleife kann ich abbrechen wenn ich gefunden habe was ich suche, nach meinem Verständnis produziert for-in ja erst eine liste aller matches bevor durchsucht wird.
Auch eine For-Schleife kann mit break abgebrochen werden. Weder for noch while produzieren eine Liste, "durchsucht" wird auch nichts (wonach sollte auch gesucht werden? und was?).
Verfasst: Samstag 20. Februar 2010, 16:12
von LanX
derdon hat geschrieben:Auch eine For-Schleife kann mit break abgebrochen werden. Weder for noch while produzieren eine Liste, "durchsucht" wird auch nichts (wonach sollte auch gesucht werden? und was?).
in anderen Worten ist sowas ein lazy iterator den ich billig abbrechen kann wenn m meinen Kriterien entspricht...
... oder werden erst allle Fundstellen der RegEx zwischengespeichert bevor for-in drüberläuft?
EDIT: Wohlgemerkt wenn runde Klammern drumrumstehen die eine Comprehension in einen Iterator verwandeln.