Рассмотрит следующий (весьма упрощенная) строку:Regex для дополнительной концевой части подстроки
'a b a b c a b c a b c'
Это повторяющийся рисунок 'a b c'
за исключением того, в самом начале, где 'c'
отсутствует.
Я ищу регулярное выражение, которое может дать мне следующие матчи с использованием re.findall()
:
[('a', 'b'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
Строки выше, таким образом, есть 4 матча из 'a b c'
- хотя с первым матчем, как частный случай, так как 'c'
отсутствует.
Моих Простейшие попытки, где я пытаюсь захватить 'a'
и 'b'
и использовать дополнительный захват для 'c'
:
re.findall(r'(a).*?(b).*?(c)?', 'a b a b c a b c a b c')
я получаю:
[('a', 'b', ''), ('a', 'b', ''), ('a', 'b', ''), ('a', 'b', '')]
Очевидно, он просто проигнорировал c
. При использовании необязательного захвата для 'c'
поиск пропускает преждевременно и пропускает 'a'
и 'b'
во втором 'a b c'
-substring. В результате 3-х неправильных матчей:
[('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
Я попробовал несколько других методов (например, '(?<=c)'
) безрезультатно.
Примечание: строка, приведенная выше, представляет собой лишь скелетный пример моей проблемы «реального мира», где три буквы выше сами являются строками (из длинного лог-файла) между другими строками и символами новой строки, из которых мне нужно извлечь названных групп.
Я использую Python 3.5.2 для Windows 7.
Вы должны удалить пустые элементы кортежи «вручную» после того, как 'ре .findall' выполняет свою работу. –
Вы уверены, что вам нужны регулярные выражения для анализа ваших журналов? –
@WayneWerner Да :) Абсолютно необходимо. –