Auf einen Textblock , regulärer Ausdruck anwenden!

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.
Antworten
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

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ß
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.
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

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???
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

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
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

ok wenn sich nichts ändern würde, war es ja die reinste zeitveschwendung mit regex! :) :oops:

@BlackJack & nomnom
danke für die schnelle und tolle hilfe!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
snafu
User
Beiträge: 6850
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

@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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?
Benutzeravatar
fecub
User
Beiträge: 24
Registriert: Freitag 14. November 2008, 16:53
Kontaktdaten:

@/me

ich habe den text original copy & pastet! es dürften eigentlich keine leerzeichen fehler enstehen!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten