Регулярные выражения Python находят все в фигурных скобках после определенной строки - PullRequest
2 голосов
/ 23 октября 2019

Привет, так что я немного борюсь с регулярным выражением. У меня есть файл rpt, из которого мне нужно получить конкретные данные. Файл выглядит примерно так:

lots of text...
[MS]
{
;Mass   % BPI
238.85  0.943
247.64  0.984
378.65  0.990
...
}
lots of text...

Я хочу получить все в фигурных скобках после появления этой строки: [MS]. Проблема в том, что в этом файле гораздо больше фигурных скобок, и они не только окружают нужные мне данные.

То, что я уже пробовал, это:

import re

file = input("Enter file path: ")
if len(file) < 1:
    file = "path"
handle = open(file)

pattern = r'^([-0-9\.eE+]+)[ \t]*(;|,)?[ \t]*([-0-9\.eE+]*)$'
findings = re.findall(pattern, handle)

print(findings)

#and then making a single dict out of it with key-value pairs

Но это не такдайте мне все, что мне нужно, он возвращает некоторые значения, но не все.

В конце я хочу, чтобы числа в фигурных скобках были словарём (пример: Key: 238.85, Value: 0.943), поэтому яможет построить это потом.

примечание: пробелы между массой и столбцами BPI - это табуляция.

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Вы можете извлечь все блоки между { и } после [MS] и затем извлечь все необходимые данные из блока:

import re
results = []

with open(path_to_file, 'r') as r:
    for block in re.findall(r'\[MS\]\s*{([^{}]+)}', r.read()):
        results.extend(re.findall(r'^(\d[\d.]*)\t(\d[\d.]*)$', block, re.M))

print(dict(results))

См. Демонстрационную версию Python

Регулярное выражение соответствия блока

  • \[MS\] - литерал [MS] текст
  • \s* - 0+ пробелов
  • { - { char
  • ([^{}]+) - Группа 1 (это то, что re.findall вернет): любые 1+ символов, кроме { и }
  • } - } символ.

Регулярное извлечение чисел

  • ^ - начало строки (из-за re.M)
  • (\d[\d.]*) - Группа 1 (ключ): цифра, а затем любые 0+ цифр или точек
  • \t - вкладка
  • (\d[\d.]*) - Группа 2 (значение): цифра, а затем любые 0+ цифр или точек
  • $ - конец строки (из-за re.M).
1 голос
/ 23 октября 2019

Выполните многоступенчатый процесс извлечения. Первый этап - это регулярное выражение, которое извлекает содержимое в скобках после MS:

re.search(r"\[MS\]\s*{([^}]+)}", s).group(0)

Оттуда вы можете анализировать данные построчно.

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