Извлечение данных из текстового файла с помощью регулярного выражения

#python #regex

#python #регулярное выражение

Вопрос:

Попытка извлечь три списка данных из текстового файла с использованием регулярных выражений

Структура файла = метаданные, значения (повтор)

 #
#text
#text
#
9.2318434E-5 -1.3870514E-9 1.0E-4 7.0E-5 9.2318434E-5 9.225606E-5 9.225606E-5 2.5E-4 2.5E-4
9.230842E-5 -1.3756367E-9 1.0E-4 7.0E-5 9.230842E-5 9.225539E-5 9.225539E-5 0.00225 0.00225
9.230592E-5 -1.3935526E-9 1.0E-4 7.0E-5 9.230592E-5 9.2255046E-5 9.2255046E-5 0.00275 0.00275

#
#text
#text
#
9.2318434E-5 -1.3870514E-9 1.0E-4 7.0E-5 9.2318434E-5 9.225606E-5 9.225606E-5 2.5E-4 2.5E-4
9.231593E-5 -1.3816212E-9 1.0E-4 7.0E-5 9.231593E-5 9.225253E-5 9.225253E-5 7.5E-4 7.5E-4
9.230592E-5 -1.3935526E-9 1.0E-4 7.0E-5 9.230592E-5 9.2255046E-5 9.2255046E-5 0.00275 0.00275

#
#text
#text
#
9.2318434E-5 -1.3870514E-9 1.0E-4 7.0E-5 9.2318434E-5 9.225606E-5 9.225606E-5 2.5E-4 2.5E-4
9.231593E-5 -1.3816212E-9 1.0E-4 7.0E-5 9.231593E-5 9.225253E-5 9.225253E-5 7.5E-4 7.5E-4
9.231343E-5 -1.3962527E-9 1.0E-4 7.0E-5 9.231343E-5 9.225581E-5 9.225581E-5 0.00125 0.00125
  

Я пробовал следующее

 with open(file) as newfile:
    data = re.findall(r'^([#][n][0-9])[sS]*([n][n])$', newfile.read())
  

Каждый блок данных начинается с # n [0-9] и заканчивается n n, а затем мне нужно взять каждый символ между началом и концом, следовательно [ s S] *. Похоже, не работает, любая помощь была бы отличной.

Комментарии:

1. я не понимаю, хотите ли вы полные 3 строки или каждое число в этих 3 строках?

2. Я ожидаю, что результатом будет список с тремя элементами, содержащий строку со всеми номерами в этом разделе, т.Е. mylist = [«numbers n numbers n numbers n», «numbers n numbers n numbers n», «numbers n numbers n numbers n»]

3. спасибо, что все работает сейчас

Ответ №1:

Кстати, вам не нужно заключать все в [] .

Смотрите, как используется регулярное выражение здесь.

 ^(?<=#n)d[^#]*$
  
  • ^ укажите позицию в начале строки
  • (?<=#n) позитивный взгляд назад, обеспечивающий, что предшествует совпадениям # , за которыми следует символ новой строки n
  • d сопоставьте цифру
  • [^#]* сопоставьте любой символ, кроме # любого количества раз (жадный, поэтому он попытается сопоставить как можно больше символов, пока не достигнет другого # )
  • $ укажите позицию в конце строки

Альтернативно, и очень просто, вы, вероятно, могли бы использовать ^d.* как показано здесь.

  • ^ укажите позицию в начале строки
  • d сопоставьте цифру
  • .* сопоставьте любой символ (за исключением символов, завершающих строку) любое количество раз

Ответ №2:

Вы можете использовать:

 import re
with open("file.txt") as f:
    t = f.read().strip()

lists = []
m = re.findall(r"^[d.Es-] $", t, re.MULTILINE) # 45 steps
for x in m:
    a = [float(x) for x in " ".join(x.strip().split("n")).split()]
    lists.append(a)

print(lists)
  

Вывод:

 [[9.2318434e-05, -1.3870514e-09, 0.0001, 7e-05, 9.2318434e-05, 9.225606e-05, 9.225606e-05, 0.00025, 0.00025, 9.230842e-05, -1.3756367e-09, 0.0001, 7e-05, 9.230842e-05, 9.225539e-05, 9.225539e-05, 0.00225, 0.00225, 9.230592e-05, -1.3935526e-09, 0.0001, 7e-05, 9.230592e-05, 9.2255046e-05, 9.2255046e-05, 0.00275, 0.00275], [9.2318434e-05, -1.3870514e-09, 0.0001, 7e-05, 9.2318434e-05, 9.225606e-05, 9.225606e-05, 0.00025, 0.00025, 9.231593e-05, -1.3816212e-09, 0.0001, 7e-05, 9.231593e-05, 9.225253e-05, 9.225253e-05, 0.00075, 0.00075, 9.230592e-05, -1.3935526e-09, 0.0001, 7e-05, 9.230592e-05, 9.2255046e-05, 9.2255046e-05, 0.00275, 0.00275], [9.2318434e-05, -1.3870514e-09, 0.0001, 7e-05, 9.2318434e-05, 9.225606e-05, 9.225606e-05, 0.00025, 0.00025, 9.231593e-05, -1.3816212e-09, 0.0001, 7e-05, 9.231593e-05, 9.225253e-05, 9.225253e-05, 0.00075, 0.00075, 9.231343e-05, -1.3962527e-09, 0.0001, 7e-05, 9.231343e-05, 9.225581e-05, 9.225581e-05, 0.00125, 0.00125]]
  

ДЕМОНСТРАЦИЯ:

Ответ №3:

Вы также можете решить эту проблему без использования регулярных выражений вообще, если хотите. Поскольку вы хотите читать только строки, которые не начинаются с символа # , вы можете просто прочитать строки из файла и проверить, начинаются ли они с # или нет. Затем очистите строку и разделите ее с интервалом, чтобы получить все числа в виде строки.

Вот пример использования понимания списка:

 numbers = []
with open(file) as newfile:
    numbers  = [number for line in newfile.readlines() if not line.startswith('#') for number in line.strip().split()]
newfile.close()
print(numbers) # list of all the numbers as strings