Seite 1 von 1
Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Montag 19. Dezember 2011, 19:41
von fecub
Hallo,
ich habe hier so einen einen log file
Code: Alles auswählen
Time = 1
Solving for fluid region fluid
GAMG: Solving for p_rgh, Initial residual = 1, Final residual = 0.00907997838, No Iterations 20
time step continuity errors : sum local = 4.55220749, global = -0.297742325, cumulative = -0.297742325
Min/max rho:1.18630305 1.2732117
ExecutionTime = 5.37 s ClockTime = 8 s
Time = 2
Solving for fluid region fluid
GAMG: Solving for p_rgh, Initial residual = 0.996191, Final residual = 0.00982025197, No Iterations 58
time step continuity errors : sum local = 4.12692641, global = -0.642391908, cumulative = -0.940134232
Min/max rho:1.1862447 1.273286
ExecutionTime = 11.29 s ClockTime = 16 s
und ich würde gerne für den jeweiligen zeitschritt den
Min/max rho: erfassen. nach meiner meinung wäre regulärer ausdruck ein guter ansatz. Nur müsste ich den
Time mit
Min/max rho: in einem durchgang erfassen, damit ich die log datei nicht 2 mal durchlaufen muss.
für rho/min habe ich diesen ausdruck
Code: Alles auswählen
regular_expression = re.finditer(r"Min/max rho:(.*)",solver_log_read, re.I)
for m in regular_expression:
print m.group(0)
Nur wie könnte ich den Time in den regulären ausdruck miteinbezihen, ist das überhaupt möglich oder was könnte ich noch machen??
freue mich über jede anwort und tipp!
Gruß
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Montag 19. Dezember 2011, 20:08
von BlackJack
@fecub: Ich würde das nicht mit nur mit einem regulärem Ausdruck versuchen sondern entweder die Eingabe in Blöcke aufteilen die so einem Zeitschritt entsprechen, oder was hier auch geht, das ganze einfach Zeilenweise parsen und sich die jeweiligen Werte merken. Dann käme man eventuell sogar ohne reguläre Ausdrücke aus.
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Montag 19. Dezember 2011, 20:13
von fecub
des habe ich mir auch überlegt, aber ich kann eine log datei von 1000 zeitschritten haben. würde die laufzeit, mit parsen und aufteilen, nicht erheblich länger sein als mit regex???
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Montag 19. Dezember 2011, 20:31
von nomnom
fecub hat geschrieben:des habe ich mir auch überlegt, aber ich kann eine log datei von 1000 zeitschritten haben. würde die laufzeit, mit parsen und aufteilen, nicht erheblich länger sein als mit regex???
Ein regulärer Ausdruck muss ja auch erstmal den Text erfassen
Und die Lösung ohne RE ist so schön einfach …
Code: Alles auswählen
>>> for line in log.splitlines(): # bei mir ist log ein string
... if line.startswith("Time = "):
... time = int(line.split("= ")[1])
... if line.startswith("Min/max rho:"):
... print time, line.split(":")[1]
...
1 1.18630305 1.2732117
2 1.1862447 1.273286
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Montag 19. Dezember 2011, 20:51
von fecub
ok wenn sich nichts ändern würde, war es ja die reinste zeitveschwendung mit regex!
@BlackJack & nomnom
danke für die schnelle und tolle hilfe!
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Dienstag 20. Dezember 2011, 11:02
von sma
Code: Alles auswählen
for rho, et, ct in re.findall("^Min/max rho:(.*?)\nExecutionTime = (.*?) s ClockTime = (.*?) s", s, re.M):
print rho, et, ct
Wobei "s" der String mit dem Text ist.
Stefan
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Dienstag 20. Dezember 2011, 11:48
von snafu
Wenn ich mir so die Anordnung der Doppelpunkte hinter den Bezeichnern hinsichtlich Leerzeichen angucke, würde ich mir überlegen, den Parser evtl etwas "Whitespace-toleranter" zu gestalten. Der Abstand ist zwar zumindest bezogen auf den Bezeichner immer gleich, aber man weiß ja nicht, inwiefern dies garantiert ist. Kommt aber auch auf den Anwendungsfall an, also ob der Parser wiederverwendbar sein soll oder ob er für diese eine Datei ausreicht.
//edit: Und naja gut. Vielleicht ist es auch einfach ein festes Format, welches von dem Programm ausgegeben wird. Ist ja ein Logfile und keine Konfigurationsdatei.
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Mittwoch 21. Dezember 2011, 13:25
von fecub
@sma
super dankeschön, aber
sma hat geschrieben:Code: Alles auswählen
for rho, et, ct in re.findall("^Min/max rho:(.*?)\nExecutionTime = (.*?) s ClockTime = (.*?) s", s, re.M):
print rho, et, ct
Wobei "s" der String mit dem Text ist.
die methode hat leider bei mir nicht funktioniert.
Code: Alles auswählen
solver_log_read = open("logs/solver.log", "r").read()
for rho, et, ct in re.findall("^Min/max rho:(.*?)\nExecutionTime = (.*?) s ClockTime = (.*?) s", solver_log_read, re.M):
print rho, et, ct
s in den anführunsgzeichen habe ich auch mit solver_log_read ersetzt, hat aber auch leider nicht funktioniert.
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Mittwoch 21. Dezember 2011, 13:30
von /me
fecub hat geschrieben:die methode hat leider bei mir nicht funktioniert.
Dann sieht der Text anders aus, als du ihn hier gezeigt hast. Sind irgendwo noch zusätzliche Leerzeichen oder Tabulatoren enthalten?
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Donnerstag 22. Dezember 2011, 13:59
von fecub
@/me
ich habe den text original copy & pastet! es dürften eigentlich keine leerzeichen fehler enstehen!
Re: Auf einen Textblock , regulärer Ausdruck anwenden!
Verfasst: Donnerstag 22. Dezember 2011, 14:12
von Hyperion
fecub hat geschrieben:
ich habe den text original copy & pastet! es dürften eigentlich keine leerzeichen fehler enstehen!
Dann kopiere ihn einfach mal von hier wieder lokal zurück und wende den Algo darauf an. Wenn das klappt, aber mit dem Original nicht, dann sind def. Zeichen verloren gegangen / verändert worden.