finditer wurde doch schon erwähnt. findall erzeugt eine Liste.
MfG
HWK
Parsing Hilfe...
Dachte ich mir, ich habe jetzt auch nur die Nachfragen von derdon und Ronnie beantwortet.HWK hat geschrieben:finditer wurde doch schon erwähnt. findall erzeugt eine Liste.
MfG
HWK
Anyway meine Frage bzgl der Iteratorform einer ListComprehension bleibt offen.
Wird die Lazyness auf alle Ebenen durchgeschleift inkl. re.findall ?
Eher nicht, oder?
MfG
rolf
verstehe ich die Anwendung von re.finditer richtig dass ich den Iterator unmittelbar vorher erst einer temporären Variablen zuordnen muss, die ich dann mit while iteriere?LanX hat geschrieben: aber mir ist nicht klar wie ich das in Python so (dh. mit while über matches iterieren) abbilden könnte...
Oder gibt es einen syntaktischen Trick die Variable zu überspringen und die Iteratordefinition in der While-Bedingung stattfinden zu lassen, (wie in dem Beispiel in einer anderen Sprache deren Namen ich lieber nicht nochmal ausspreche ?
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
[pseudopython]
for x in finditer:
if found: break[/pseudopython]
Du willst kein `while`. Und syntaktische, magische Tricks gibt es in Python gluecklicherweise auch nicht
for x in finditer:
if found: break[/pseudopython]
Du willst kein `while`. Und syntaktische, magische Tricks gibt es in Python gluecklicherweise auch nicht
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Danke cofi!
Mittlerweile bin ich auch selbst darauf gekommen das for-in immer ein iterierbares Objekt frisst, und eine Liste einfach nur ein weiteres dieser Objekte ist ...
(nettes Design )
Aber was geht jetzt hier schief, wieso klappts mit findall aber nicht mit finditer?
Mittlerweile bin ich auch selbst darauf gekommen das for-in immer ein iterierbares Objekt frisst, und eine Liste einfach nur ein weiteres dieser Objekte ist ...
(nettes Design )
Aber was geht jetzt hier schief, wieso klappts mit findall aber nicht mit finditer?
Code: Alles auswählen
>>> for m in re.findall(r'(\w+)\s*\[(.+)\]', config):
... table[m[0]]=m[1].split(",")
...
>>> table
{'COUNT': ['1'], 'LOOPSTART': ['TEST_FLASHMODE'], 'TARGET': ['10'], 'DIAG': ['SET_ENERGIESPARMODE_NORMAL'], 'SEND': ['31', '01', '0F', '0C', '00'], 'SOURCE': ['F1'], 'EXPECT': ['71', '01', '0F', '0C', '*'], 'TIMEOUT': ['0']}
>>> table={}
>>> for m in re.finditer(r'(\w+)\s*\[(.+)\]', config):
... table[m[0]]=m[1].split(",")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: '_sre.SRE_Match' object is unsubscriptable
nach einigem googlen bin ich auf die Methode "group()" gestoßen, so läufts
allerdings was ich über nettes Design gesagt habe nehm ich zurück ...
Warum finditer hier ein Objekt mit ganz anderem Interface zurückgibt als findall, insbesondere ein nicht indizierbares fällt mir schwer zu verstehen...
Code: Alles auswählen
>>> table={}
>>> for m in re.finditer(r'(\w+)\s*\[(.+)\]', config):
... table[m.group(1)] = m.group(2).split(',')
...
>>> table
{'COUNT': ['1'], 'LOOPSTART': ['TEST_FLASHMODE'], 'TARGET': ['10'], 'DIAG': ['SET_ENERGIESPARMODE_NORMAL'], 'SEND': ['31', '01', '0F', '0C', '00'], 'SOURCE': ['F1'], 'EXPECT': ['71', '01', '0F', '0C', '*'], 'TIMEOUT': ['0']}
Warum finditer hier ein Objekt mit ganz anderem Interface zurückgibt als findall, insbesondere ein nicht indizierbares fällt mir schwer zu verstehen...
ich wollte eingitlich Text-Dateien, wie unten angegeben, öffnen und so parsen:
1.Python liest diese LOOPSTART und nimmt dem Wert von COUNT[..]
2.er muss die Ausgaben bis LOOPENDE wiederholen (ZB hier 5 mal)
3.in jede Zeile steht
DIAG[] SEND[] EXPECT[] TIMEOUT [] SOURCE[] TARGET []
nur zwichen den klammen ändert sich
kann ich in Python Blöcke (Strukturen) machen ?
ZB. ein Struktur mit Elements (DIAG,SEND,TIMEOUT,SOURCE,TARGET)
und eine Zweite mit diesem Elements(LOOPSTART, COUNT,LOOPENDE)
????????????????
LOOPSTART [TEST] COUNT [5]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
DIAG [T] SEND[22,0B]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [05]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [0D]
WAIT [5000]
LOOPEND [TEST]
1.Python liest diese LOOPSTART und nimmt dem Wert von COUNT[..]
2.er muss die Ausgaben bis LOOPENDE wiederholen (ZB hier 5 mal)
3.in jede Zeile steht
DIAG[] SEND[] EXPECT[] TIMEOUT [] SOURCE[] TARGET []
nur zwichen den klammen ändert sich
kann ich in Python Blöcke (Strukturen) machen ?
ZB. ein Struktur mit Elements (DIAG,SEND,TIMEOUT,SOURCE,TARGET)
und eine Zweite mit diesem Elements(LOOPSTART, COUNT,LOOPENDE)
????????????????
LOOPSTART [TEST] COUNT [5]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
DIAG [T] SEND[22,0B]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [05]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [0D]
WAIT [5000]
LOOPEND [TEST]
a) ja es geht
b) die bisher geposteten Lösungen mit einem hash/dictionary solltest du vergessen, weil sie unsortiert sind, es aber bei dir auf die Reihenfolge ankommt.
nimm eine der gezeigten for-in schleifen, merke dir den "counter" wenn dein "loopstart" beginnt und werte ihn dach belieben aus wenn "loopend" kommt.
ListComprehensions solltest du IMHO jetzt besser lassen, Ronnie will nur spielen.
b) die bisher geposteten Lösungen mit einem hash/dictionary solltest du vergessen, weil sie unsortiert sind, es aber bei dir auf die Reihenfolge ankommt.
nimm eine der gezeigten for-in schleifen, merke dir den "counter" wenn dein "loopstart" beginnt und werte ihn dach belieben aus wenn "loopend" kommt.
ListComprehensions solltest du IMHO jetzt besser lassen, Ronnie will nur spielen.
Sorry, der OP (walha2006) hat in seinem ersten Post die Problemstellung anders beschrieben - bzw. nicht die Mühe gemacht sein Problem richtig zu beschreiben. Das fällt also in die Kategorie: "Ich wollte einen Lamborghini, konnte es aber nicht aussprechen."LanX hat geschrieben:(...) die bisher geposteten Lösungen mit einem hash/dictionary solltest du vergessen (...)
Achtung: User ist ein Python-Lehrling!
ja ,sorry ,ich habe mein Problem nicht gut beschrieben , aber jetzt ,ich glaube ,es ist schön klar ....und vielen danke Ronnie ,dein Antwort hat mir gut geholfen ,aber danach habe ich fesgestellt ,das Problem mit dem Loop ...geht einfach nicht mit dem hash/dictionary..Ronnie hat geschrieben:Sorry, der OP (walha2006) hat in seinem ersten Post die Problemstellung anders beschrieben - bzw. nicht die Mühe gemacht sein Problem richtig zu beschreiben. Das fällt also in die Kategorie: "Ich wollte einen Lamborghini, konnte es aber nicht aussprechen."LanX hat geschrieben:(...) die bisher geposteten Lösungen mit einem hash/dictionary solltest du vergessen (...)
Dann eben mit einem Array_of_Dictionaries:walha2006 hat geschrieben:... das Problem mit dem Loop ...geht einfach nicht mit dem hash/dictionary..
Code: Alles auswählen
>>> config = """LOOPSTART [TEST] COUNT [5]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
DIAG [T] SEND[22,0B]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [05]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [0D]
WAIT [5000]
LOOPEND [TEST]"""
>>> 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*\[(.*?)\]', l)]) for l in config.split("\n")]
Achtung: User ist ein Python-Lehrling!
aber Dem Inhalt von dem Datein ändert sich ,Besonders zwischen [ ] ,ändert sich ,wie kann ich die Werte markieren Z.B im COUNT[?]?Ronnie hat geschrieben:Dann eben mit einem Array_of_Dictionaries:walha2006 hat geschrieben:... das Problem mit dem Loop ...geht einfach nicht mit dem hash/dictionary..Code: Alles auswählen
>>> config = """LOOPSTART [TEST] COUNT [5] DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00] DIAG [T] SEND[22,0B]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [05] DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [0D] WAIT [5000] LOOPEND [TEST]""" >>> 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*\[(.*?)\]', l)]) for l in config.split("\n")]
walha2006 hat geschrieben:aber Dem Inhalt von dem Datein ändert sich ,Besonders zwischen [ ] ,ändert sich ,wie kann ich die Werte markieren Z.B im COUNT[?]?
Code: Alles auswählen
table[0]['COUNT']
Achtung: User ist ein Python-Lehrling!
da ich vermute, dass der OP Probleme hat die verschachtelte Datenstruktur zu nutzen, hier mal ein kleines (konstruiertes) Beispiel:
Code: Alles auswählen
>>> config = """LOOPSTART [TEST] COUNT [5]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
DIAG [T] SEND[22,0B]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [05]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [0D]
WAIT [5000]
LOOPEND [TEST]"""
>>> 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*\[(.*?)\]', l)]) for l in config.split("\n")]
>>> class ComProbe:
def __init__(self, t):
self.name = t[0]['LOOPSTART']
self.cnt = t[0]['COUNT']
self.tests = t[1:-1]
def run(self):
for i in range(0, int(self.cnt)):
print("running " + self.name + " for " + str(i+1) + " time:")
for test in self.tests:
if 'DIAG' in test:
print("\tsending " + str(test['SEND']) + " from " + test['SOURCE'] + " to " + test['TARGET'] )
else:
print("\twaiting: "+ test['WAIT'])
>>> t = ComProbe(table)
>>> t.run()
Achtung: User ist ein Python-Lehrling!
Vielen dank Ronnie ,aber ich habe verschidene Datein
(test1.txt ,test2.txt)
ich muss die Files öffnen und dann suchen ,jeder Datei hat verschiedene Werten ,zwichen [..]
hier habe ich so versucht:
aber ich glaube ohne die Config ,geht nicht ,weil dem config ändert sich beim jeden Datei ..oder?
Danke Danke Danke Danke Danke Danke
(test1.txt ,test2.txt)
ich muss die Files öffnen und dann suchen ,jeder Datei hat verschiedene Werten ,zwichen [..]
hier habe ich so versucht:
Code: Alles auswählen
def leseDatei(datei):
d = {}
f = open(datei)
for zeile in f:
zeile = zeile.strip()
wort = zeile.strip()
if "LOOPSTART" in zeile:
key, d[key] = (s.strip() for s in zeile.split("\n"))
elif "key" in locals():
d[key] += "\n%s" % zeile.strip()
f.close()
return d
def __init__(self, t):
self.name = t[0]['LOOPSTART']
self.cnt = t[0]['COUNT']
self.tests = t[1:-1]
def run(self):
for i in range(0, int(self.cnt)):
print("running " + self.name + " for " + str(i+1) + " time:")
for test in self.tests:
if 'DIAG' in test:
print("\tsending " + str(test['SEND']) + " from " + test['SOURCE'] + " to " + test['TARGET'] )
else:
print("\twaiting: "+ test['WAIT'])
Danke Danke Danke Danke Danke Danke
He!
hier versuche ich das Problem nochmal zu eklären
ich habe einfach Text Datein (test1.txt ,test2.txt...),
ZB.inhalt von test1:
(
LOOPSTART [TEST1] COUNT [2]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
WAIT [5000]
LOOPEND [TEST]
)
Inhalt von test2:
(
LOOPSTART [TEST2] COUNT [1]
DIAG [T] SEND[20,AF]EXPECT[] TIMEOUT [0] SOURCE[F4] TARGET [10]
WAIT [1000]
LOOPEND [TEST2]
)
ich wollte :
1:Datei öffnen und finde COUNT
2:speichern dem Wert von COUNT (ZB. in test1 "2" ,in test2 "1" )
3:lesen dem Inhalt dem Schleife in Reihe (zwichen LOOPSTART und LOOPENDE ) und dem Ganze wiederholen COUNT mal ,Hier im (test1)
2 mal :
im test 1 soll die ausgabe so sein:
(
DIAG: 'T' ; SEND: '22,3F' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F1' ;TARGET:'00'; WAIT:'5000'
DIAG: 'T' ; SEND: '22,3F' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F1' ;TARGET:'00';WAIT:'5000'
)
und in test 2 soll die Ausgabe so sein
(
DIAG: 'T' ; SEND: '20,AF' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F4' ;TARGET'10';WAIT:'1000'
)
hier versuche ich das Problem nochmal zu eklären
ich habe einfach Text Datein (test1.txt ,test2.txt...),
ZB.inhalt von test1:
(
LOOPSTART [TEST1] COUNT [2]
DIAG [T] SEND[22,3F]EXPECT[] TIMEOUT [0] SOURCE[F1] TARGET [00]
WAIT [5000]
LOOPEND [TEST]
)
Inhalt von test2:
(
LOOPSTART [TEST2] COUNT [1]
DIAG [T] SEND[20,AF]EXPECT[] TIMEOUT [0] SOURCE[F4] TARGET [10]
WAIT [1000]
LOOPEND [TEST2]
)
ich wollte :
1:Datei öffnen und finde COUNT
2:speichern dem Wert von COUNT (ZB. in test1 "2" ,in test2 "1" )
3:lesen dem Inhalt dem Schleife in Reihe (zwichen LOOPSTART und LOOPENDE ) und dem Ganze wiederholen COUNT mal ,Hier im (test1)
2 mal :
im test 1 soll die ausgabe so sein:
(
DIAG: 'T' ; SEND: '22,3F' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F1' ;TARGET:'00'; WAIT:'5000'
DIAG: 'T' ; SEND: '22,3F' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F1' ;TARGET:'00';WAIT:'5000'
)
und in test 2 soll die Ausgabe so sein
(
DIAG: 'T' ; SEND: '20,AF' EXPECT:' ';TIMEOUT:'0'; SOURCE:'F4' ;TARGET'10';WAIT:'1000'
)