Parsing Hilfe...

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.
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

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]
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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.
Achtung: User ist ein Python-Lehrling!
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

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... :roll:
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

walha2006 hat geschrieben:Danke Ronnie ,aber kannst du mir vielleicht eine klein Beispiel geben... :roll:
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 :oops:

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.
Achtung: User ist ein Python-Lehrling!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Frage ist noch, ob es zu Verschachtelungen kommen kann. Denn dann reicht ein einfacher RegExp nicht mehr aus.
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

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...... :roll:
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

derdon hat geschrieben:Ronnie: Die eckigen Klammern darfst du weglassen. Das ist wohl zum meinem Standard-Nervspruch geworden...
Bitte einpaar Vorlschäge? :( :roll:
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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? :( :roll:
Was stimmt denn nicht mit Ronnies Lösung?
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

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? :( :roll:
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))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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? :( :roll:
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?
walha2006
User
Beiträge: 15
Registriert: Sonntag 7. Februar 2010, 21:24

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 ... :shock:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ... :shock:
Ja und das kannste doch mit der Lösung?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

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
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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
Achtung: User ist ein Python-Lehrling!
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

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
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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?).
LanX
User
Beiträge: 92
Registriert: Samstag 20. Februar 2010, 12:46

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...

Code: Alles auswählen

 for m in re.findall(r'(\w+)\s*\[(.+)\]', config)
... 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.
Antworten