Erst einmal die Beschreibung:
Folgende reguläre Ausdrücke kommen vor: (die ersten 7 sind Zahlen, die anderen 3 Strings)
squares, p1, p2, p3, p4, p5, residual, 'convergence', 'divergence', 'Matrix'
Die Textdatei, die durchsucht wird, erscheint immer wieder neu und kann wie folgt aussehen:
Entweder findet er
1. squares, p1, p2, p3, p4, p5, residual
oder
2. divergence, p1, p2, p3, p4, p5, residual
oder
3. convergence
oder
4. Matrix
Die Anweisungen danach sind bei
1. squares, p1, p2, p3, p4, p5, residual in pardatei schreiben
2. p1, p2, p3, p4, p5, residual und 'divergence' in errordatei schreiben
3. 'convergence' in errordatei schreiben
4. 'Matrix' in errordatei schreiben
Das folgende Ungetüm ist natürlich viel zu unübersichtlich, obwohl alles richtig läuft.
Mir ist aber unklar, wie ich das vereinfachen kann. (Sehe den Wald vor lauter Bäumen nicht mehr!)
Ich hoffe Ihr könnt mir ein paar Tipps geben!
Code: Alles auswählen
def re_find_nth(pattern, text, index=1, flags=0):
"""Find the n-th match. Counting starts with zero.
Default index is 1 == the second match.
Returns `None` if there are not enough matches.
"""
for i, match in enumerate(re.finditer(pattern, text, flags)):
if i == index:
return match
return None
# .....
with open( vplaninausgabemyz ) as f2:
text = f2.read()
if re_find_nth(r'SQUARES (\s*-?\d*\.\d*[E]?[+-]?\d?\d?\d?)', text, index=0):
result_squares = re_find_nth(r'SQUARES (\s*-?\d*\.\d*[E]?[+-]?\d?\d?\d?)', text, index=0)
if result_squares is not None:
squares = result_squares.group(1)
result_residual = re_find_nth(r'Residual: (-?\d*\.\d*)', text)
if result_residual is not None:
residual = result_residual.group(1)
result_parameter1 = re_find_nth(r'p1: (-?\d*\.?\d*)', text)
if result_parameter1 is not None:
parameter1 = result_parameter1.group(1)
result_parameter2 = re_find_nth(r'p2: (-?\d*\.?\d*)', text)
if result_parameter2 is not None:
parameter2 = result_parameter2.group(1)
result_parameter3 = re_find_nth(r'p3: (-?\d*\.?\d*)', text)
if result_parameter3 is not None:
parameter3 = result_parameter3.group(1)
result_parameter4 = re_find_nth(r'p4: (-?\d*\.?\d*)', text)
if result_parameter4 is not None:
parameter4 = result_parameter4.group(1)
result_parameter5 = re_find_nth(r'p5: (-?\d*\.?\d*)', text)
if result_parameter5 is not None:
parameter5 = result_parameter5.group(1)
parameterliste = parameter1, parameter2, parameter3, parameter4, parameter5
with open( pardateineu, 'a') as datendatei:
for p in parameterliste:
datendatei.write(" %.7f"%(string.atof(p),))
datendatei.write(" %5d %.1f %.1f %10s %25s "%(lfd, eps, sigma, residual, squares))
datendatei.write("\n")
elif re_find_nth(r'Residual: (-?\d*\.\d*)', text):
result_residual = re_find_nth(r'Residual: (-?\d*\.\d*)', text)
if result_residual is not None:
residual = result_residual.group(1)
result_parameter1 = re_find_nth(r'p1: (-?\d*\.?\d*)', text)
if result_parameter1 is not None:
parameter1 = result_parameter1.group(1)
result_parameter2 = re_find_nth(r'p2: (-?\d*\.?\d*)', text)
if result_parameter2 is not None:
parameter2 = result_parameter2.group(1)
result_parameter3 = re_find_nth(r'p3: (-?\d*\.?\d*)', text)
if result_parameter3 is not None:
parameter3 = result_parameter3.group(1)
result_parameter4 = re_find_nth(r'p4: (-?\d*\.?\d*)', text)
if result_parameter4 is not None:
parameter4 = result_parameter4.group(1)
result_parameter5 = re_find_nth(r'p5: (-?\d*\.?\d*)', text)
if result_parameter5 is not None:
parameter5 = result_parameter5.group(1)
parameterliste = parameter1, parameter2, parameter3, parameter4, parameter5
with open( pardateineu, 'a') as datendatei:
for p in parameterliste:
datendatei.write(" %.7f"%(string.atof(p),))
datendatei.write(" %5d %.1f %.1f %10s "%(lfd, eps, sigma, residual))
datendatei.write("\n")
elif re_find_nth('No corrector convergence', text, index=0):
convergence = re_find_nth('No corrector convergence', text, index=0).group()
with open( pardateineu, 'a') as datei:
datei.write("\n") #zur besseren Uebersicht neue Zeile bei Fehler
with open( errormessmyz, 'a') as errordatei:
errordatei.write("%5d %.2f %.2f "%(lfd, eps, sigma))
errordatei.write("No corrector convergence")
errordatei.write("\n")
elif re_find_nth('divergence', text, index=0):
divergence = re_find_nth('divergence', text, index=0).group()
with open( pardateineu, 'a') as datei:
datei.write("\n") #zur besseren Uebersicht neue Zeile bei Fehler
with open( errormessmyz, 'a') as errordatei:
errordatei.write("%5d %.2f %.2f"%(lfd, eps, sigma))
errordatei.write("divergence")
for a in parameterliste:
errordatei.write("%.7f "%(string.atof(a),))
errordatei.write("\n")
elif re_find_nth('Matrix', text, index=0):
matrix = re_find_nth('Matrix', text, index=0).group()
with open( pardateineu, 'a') as datei:
datei.write("\n") #zur besseren Uebersicht neue Zeile bei Fehler
with open( errormessmyz, 'a') as errordatei:
errordatei.write("%5d %.2f %.2f"%(lfd, eps, sigma))
for p in zzkurz:
errordatei.write("%.12f "%(string.atof(p),))
errordatei.write("Matrix nicht voller Spaltenrang")
errordatei.write("\n")