REGEX - элемент списка совпадений, за которым следует другой элемент списка n раз - PullRequest
1 голос
/ 29 октября 2019

Предположим, у нас есть список

search_list = [one, two, three, four, five, six]

, и мы хотим сопоставить любой элемент в этом списке, который следует за другим элементом n раз в следующей строке

example string = This string has one two three and also five six in it

Как мы построим регулярное выражение, которое может найти все элементы, которые находятся рядом друг с другом?

В этом случае при поиске с помощью re.findall на выходе должно получиться

[('one', 'two', 'three'), ('five', 'six')]

Вот что я пробовал до сих пор

Преобразование списка в строку с возможностью поиска:

chain_regex = [re.escape(i) for i in search_list]
chain_regex = '|'.join(chain_re)
re.findall(f'({chain_regex})\s*({chain_regex})', example_string)

Это прекрасно работает и выдает следующий вывод:

[('one', 'two'), ('five', 'six')]

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

re.findall(f'({chain_regex})\s*({chain_regex})\s*({chain_regex})*\s*({chain_regex})*', example_string) etc....

EDIT

re.findall(f'({chain_re})(\s*({chain_re}))+', example_string)

производит следующий вывод, которыйне совсем правильно.

[('one', ' three', 'three'), ('five', ' six', 'six')]

Объединение все большего и большего количества элементов работает , однако я не всегда могу быть уверен, сколько раз мне понадобится связать их вместе -вот где я застрял

1 Ответ

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

Вы можете сделать это с помощью простого регулярного выражения, но вы должны отфильтровать результаты:

import re

test1 = "This string has one two three and also five six in it"
reg = re.compile(r"(((one|two|three|four|five|six).?)*)")
match = re.findall(reg, test)
filtered = [m[0] for m in match if len(m[0].split(" ")) > 1]
filtered = [list(filter(None, f.split(' '))) for f in filtered]
filtered #[['one', 'two', 'three'], ['five', 'six']]

Пример: (обновлено) https://regex101.com/r/YhlhRQ/4

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