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

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

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

#
#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])[\s\S]*([\n][\n])$', newfile.read())

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

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

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

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

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

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

  • ^ утверждение позиции в начале строки
  • \d совпадение с цифрой
  • .* совпадение с любым символом (кроме ограничителей строки) любое количество раз
0 голосов
/ 03 апреля 2019

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

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

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
0 голосов
/ 03 апреля 2019

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

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

lists = []
m = re.findall(r"^[\d.E\s-]+$", 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]]

Демо-версия:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...