Verfasst: Samstag 20. Februar 2010, 16:30
finditer wurde doch schon erwähnt. findall erzeugt eine Liste.
MfG
HWK
MfG
HWK
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
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
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...
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
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']}
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 (...)
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 (...)
@Ronnie: schon klar....Ronnie hat geschrieben:Sorry, ...
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")]
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']
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()
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'])