#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