Соответствуйте мультилинии regex в объекте файла

Как я могу извлечь группы из этого regex от объекта файла (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))

Проблема в последней части кода, то, что я выполняю итерации линию за линией, который, очевидно, не работает с мультилинией regex. Я попытался использовать pattern.finditer(ifile) как это:

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

... только, чтобы видеть, работает ли это, но finditer метод требует строки или буфера.

Я также попробовал этот метод, но не могу заставить его работать

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

Какая-либо идея?


После комментария от Mike и Tuomas, мне сказали использовать .read ().. Что-то вроде этого:

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

Это хорошо работает, но это было бы корректным способом перерыть файл? Не может заставить это работать...

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

Решение

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

Возможно, это может быть записано более компактный и pythonic хотя....

11
задан user265978 15 March 2010 в 09:52
поделиться

3 ответа

Вы можете прочитать данные из файлового объекта в строку с помощью ifile.read ()

5
ответ дан 3 December 2019 в 11:03
поделиться
times = [match.group(1) for match in pattern.finditer(ifile.read())]

finditer yield MatchObjects . Если регулярное выражение ничего не соответствует, раз будет пустым списком.

Вы также можете изменить свое регулярное выражение, чтобы использовать группы без захвата для storeU , storeI , iIx и avgCI , затем pattern.findall будет содержать только совпавшие времена.

Примечание: имя переменной время может затенять стандартный библиотечный модуль. раз было бы лучшим вариантом.

1
ответ дан 3 December 2019 в 11:03
поделиться

Почему бы вам не прочитать весь файл в буфер, используя

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

, а затем выполнить поиск с этим?

1
ответ дан 3 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: