Pregunta

¿Cómo puedo extraer los grupos de este Regex de un objeto de archivo (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))

El problema en la última parte del código es que itero Line by Line, que obviamente no funciona con Multiline Regex. He intentado usar pattern.finditer(ifile) como esto:

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

... Solo para ver si funciona, pero el método FindIter requiere una cadena o búfer.

También he probado este método, pero no puedo hacer que funcione

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

¿Alguna idea?


Después de un comentario de Mike y Tuomas, me dijeron que usara .read () ... algo como esto:

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

Esto funciona bien, pero ¿sería esta la forma correcta de buscar en el archivo? No puedo hacer que funcione ...

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

Solución

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

Tal vez se pueda escribir más compacto y pitónico ...

¿Fue útil?

Solución

Puede leer los datos del objeto de archivo en una cadena con ifile.read()

Otros consejos

¿Por qué no lees todo el archivo en un búfer usando

buffer = open("data.txt").read()

¿Y luego hacer una búsqueda con eso?

times = [match.group(1) for match in pattern.finditer(ifile.read())]

finditer rendir MatchObjects. Si el regex no coincide con nada times será una lista vacía.

También puede modificar su regex para utilizar grupos no capturantes para storeU, storeI, iIx y avgCI, después pattern.findall contendrá solo tiempos coincidentes.

Nota: variable de nombres time podría sombra de módulo de biblioteca estándar. times sería una mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top