Организация одинаковых регулярных выражений в разных строках в словаре - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь извлечь метаданные о появлении регулярных выражений. Особенно я застрял в том, как (лучше) извлечь строку текста, где происходит совпадение. Проблема возникает, когда есть несколько равных совпадений.

Соответственно, я написал небольшой скрипт, извлекающий нужный паттерн и повторяющий его с помощью re.finditer. Тем не менее, я застрял на том, как лучше «приостановить» мой цикл, чтобы вернуть правильный match_index со строкой. Я чувствую, что генераторы могут стоить взглянуть, или я мог пропустить нестандартный метод.

Каким был бы самый «питонический» (и реально работающий) способ сделать следующее?

import re

string = """a zero line
we can write pattern_1 here
let's buffer here, just chilling, everything's ok
I think it's time for a second pattern_2
let's a do another pattern_1
ciao
"""

pattern = re.compile(r"\w{7}_\d")
found = re.finditer(pattern, string)

matches_list = []
for match_index, match in enumerate(list(found)):
    for index, line in enumerate(string.splitlines()):
        if match.group() in line:
            match_meta_dict = {
                'match_index': match_index,
                'line': index
            }
            matches_list.append(match_meta_dict)
            break

print(matches_list)

Я бы хотел получить список словарей, где строка соответствует шаблону, например:

[{'match_index': 0, 'line': 1}, {'match_index': 1, 'line': 3}, {'match_index': 2, 'line': 4}]

Вместо этого я получаю (очевидно):

[{'match_index': 0, 'line': 1}, {'match_index': 1, 'line': 3}, {'match_index': 2, 'line': 1}]

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы уверены, что массив словарей - лучшая структура данных для хранения этого? Я думаю, что массива целых чисел будет достаточно, потому что match_index всегда начинается с 0 и увеличивается на 1, так что вам действительно нужно хранить номера строк. Индекс этого номера строки равен индекс соответствия. Если вы настаиваете на массиве словарей, вы можете легко преобразовать в него массив номеров строк.

line_numbers = []
for index, line in enumerate(string.splitlines()):
    for match in re.finditer(pattern, line):
        line_numbers.append(index)

Преобразование в массив словаря:

matches_list = []
for index, line_number in enumerate(line_numbers):
    matches_list.append({"match_index": index, "line": line_number})
0 голосов
/ 13 января 2019

Просто перебирайте строки и всякий раз, когда вы находите совпадение, увеличивайте переменную счетчика.

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