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]
Parsing Hilfe...
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.walha2006 hat geschrieben:... ich muss ein Grammatik erstellen, oder?
Achtung: User ist ein Python-Lehrling!
Danke Roonie ,aber kannst du mir vielleicht eine klein Beispiel geben...Ronnie hat geschrieben: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.walha2006 hat geschrieben:... ich muss ein Grammatik erstellen, oder?
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 istwalha2006 hat geschrieben:Danke Ronnie ,aber kannst du mir vielleicht eine klein Beispiel geben...
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)] )
Achtung: User ist ein Python-Lehrling!
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......Hyperion hat geschrieben:Die Frage ist noch, ob es zu Verschachtelungen kommen kann. Denn dann reicht ein einfacher RegExp nicht mehr aus.
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))
the more they change the more they stay the same
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was stimmt denn nicht mit Ronnies Lösung?walha2006 hat geschrieben:Bitte einpaar Vorlschäge?derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
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" :Hyperion hat geschrieben:Was stimmt denn nicht mit Ronnies Lösung?walha2006 hat geschrieben:Bitte einpaar Vorlschäge?derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
funcs = {'int':int, 'float':float, 'list': list}
for func,args in matches:
print funcs[func](eval(args))
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?walha2006 hat geschrieben: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" :Hyperion hat geschrieben:Was stimmt denn nicht mit Ronnies Lösung?walha2006 hat geschrieben:Bitte einpaar Vorlschäge?derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
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 ...Hyperion hat geschrieben:Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ja und das kannste doch mit der Lösung?walha2006 hat geschrieben: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 ...Hyperion hat geschrieben:Ich verstehe nicht, was Du damit meinst! Was ist die Funktion senden()? Wieso kannst Du sie nicht aufrufen?
verwende ein dict.!self ggf. weglassen, für die Parameter => http://docs.python.org/tutorial/control ... ment-lists
Code: Alles auswählen
handler = {'SENDEN' : self.send, 'ANDERE FUNC' : self.other_func}
the more they change the more they stay the same
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
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
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 );
Grüße
rolf
EDIT: typo korrigiert
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
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
Achtung: User ist ein Python-Lehrling!
Hi Ronnie
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
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.Ronnie hat geschrieben: wieso willst du unbedingt eine while-Schleife verwenden, wenn sich doch ein for-in-Loop eher anbieten würde?
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
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?).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.
in anderen Worten ist sowas ein lazy iterator den ich billig abbrechen kann wenn m meinen Kriterien entspricht...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?).
Code: Alles auswählen
for m in re.findall(r'(\w+)\s*\[(.+)\]', config)
EDIT: Wohlgemerkt wenn runde Klammern drumrumstehen die eine Comprehension in einen Iterator verwandeln.