Stimmt mit mehrzeiligem regulären Ausdruck im Dateiobjekt überein

Wie kann ich die Gruppen aus diesem regulären Ausdruck aus einem Dateiobjekt (data.txt) extrahieren?

import numpy as np
import re
import os
ifile = open("data.txt",'r')

# Regex pattern
pattern = re.compile(r"""
                ^Time:(\d{2}:\d{2}:\d{2})   # Time: 12:34:56 at beginning of line
                \r{2}                       # Two carriage return
                \D+                         # 1 or more non-digits
                storeU=(\d+\.\d+)
                \s
                uIx=(\d+)
                \s
                storeI=(-?\d+.\d+)
                \s
                iIx=(\d+)
                \s
                avgCI=(-?\d+.\d+)
                """, re.VERBOSE | re.MULTILINE)

time = [];

for line in ifile:
    match = re.search(pattern, line)
    if match:
        time.append(match.group(1))

Das Problem im letzten Teil des Codes ist, dass ich zeilenweise iteriere, was bei mehrzeiligem Regex offensichtlich nicht funktioniert. Ich habe versucht zu verwendenpattern.finditer(ifile) so was:

for match in pattern.finditer(ifile):
    print match

... nur um zu sehen, ob es funktioniert, aber die Finditer-Methode benötigt einen String oder Puffer.

Ich habe diese Methode auch ausprobiert, kann sie aber nicht zum Laufen bringen

matches = [m.groups() for m in pattern.finditer(ifile)]

Irgendeine Idee?

Nach einem Kommentar von Mike und Tuomas wurde mir gesagt, ich solle .read () verwenden.

ifile = open("data.txt",'r').read()

Dies funktioniert einwandfrei, aber wäre dies der richtige Weg, um die Datei zu durchsuchen? Ich kann es nicht zum Laufen bringen ...

for i in pattern.finditer(ifile):
    match = re.search(pattern, i)
    if match:
        time.append(match.group(1))
Lösung
# Open file as file object and read to string
ifile = open("data.txt",'r')

# Read file object to string
text = ifile.read()

# Close file object
ifile.close()

# Regex pattern
pattern_meas = re.compile(r"""
                ^Time:(\d{2}:\d{2}:\d{2})   # Time: 12:34:56 at beginning of line
                \n{2}                       # Two newlines
                \D+                         # 1 or more non-digits
                storeU=(\d+\.\d+)           # Decimal-number
                \s
                uIx=(\d+)                   # Fetch uIx-variable
                \s
                storeI=(-?\d+.\d+)          # Fetch storeI-variable
                \s
                iIx=(\d+)                   # Fetch iIx-variable
                \s
                avgCI=(-?\d+.\d+)           # Fetch avgCI-variable
                """, re.VERBOSE | re.MULTILINE)

file_times = open("output_times.txt","w")
for match in pattern_meas.finditer(text):
    output = "%s,\t%s,\t\t%s,\t%s,\t\t%s,\t%s\n" % (match.group(1), match.group(2), match.group(3), match.group(4), match.group(5), match.group(6))
    file_times.write(output)
file_times.close()

Vielleicht kann es aber kompakter und pythonischer geschrieben werden ....

Antworten auf die Frage(3)

Ihre Antwort auf die Frage