Предположим, у нас есть список
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')]
Объединение все большего и большего количества элементов работает , однако я не всегда могу быть уверен, сколько раз мне понадобится связать их вместе -вот где я застрял