Match multiligne regex dans le fichier objet

Comment puis-je extraire les groupes à partir de cette expression à partir d'un fichier objet (data.txt)?

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))

Le problème dans la dernière partie du code, c'est que je itérer ligne par ligne, ce qui évidemment ne fonctionne pas avec multiligne regex. J'ai essayé d'utiliser pattern.finditer(ifile) comme ceci:

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

... juste pour voir si ça fonctionne, mais le finditer méthode nécessite une chaîne de caractères ou un tampon.

J'ai aussi essayé cette méthode, mais ne peut pas le faire fonctionner

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

Une idée?


Après le commentaire de Mike et Tuomas, on m'a dit de l'utiliser .read().. quelque Chose comme ceci:

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

Cela fonctionne bien, mais serait-ce la bonne façon de chercher dans le fichier? Pouvez pas le faire fonctionner...

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

Solution

# 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()

Peut-être il peut être écrit de plus en plus compacts et pythonic....

Êtes-vous sûr que \r est bon pour les retours chariot? Êtes-vous un pré-Mac OS X? Essayez \n ou (\r?\n).
Merci! \n semble donner un meilleur résultat.
il ya une telle chose comme match.groups() que vous pouvez tranche d'ignorer le premier des arguments, ou vous pouvez faire: match.group(1, 2, 3, 4, 5, 6).
Ajouter re.DOTALL argument pour faire des caractères génériques correspondent à des retours à la ligne

OriginalL'auteur user265978 | 2010-03-12