Как я могу извлечь группы из этого 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 хотя....
Вы можете прочитать данные из файлового объекта в строку с помощью ifile.read ()
times = [match.group(1) for match in pattern.finditer(ifile.read())]
finditer
yield MatchObjects
. Если регулярное выражение ничего не соответствует, раз
будет пустым списком.
Вы также можете изменить свое регулярное выражение, чтобы использовать группы без захвата для storeU
, storeI
, iIx
и avgCI
, затем pattern.findall
будет содержать только совпавшие времена.
Примечание: имя переменной время
может затенять стандартный библиотечный модуль. раз
было бы лучшим вариантом.
Почему бы вам не прочитать весь файл в буфер, используя
buffer = open("data.txt").read()
, а затем выполнить поиск с этим?