Regular Expressions
Lookahead и Lookbehind
Поиск…
Синтаксис
- Положительный взгляд:
(?=pattern)
- Отрицательный взгляд:
(?!pattern)
- Положительный lookbehind :
(?<=pattern)
- Отрицательный lookbehind :
(?<!pattern)
замечания
Не поддерживается всеми двигателями регулярных выражений.
Кроме того, многие механизмы регулярных выражений ограничивают шаблоны внутри lookbehinds строками фиксированной длины. Например, шаблон (?<=a+)b
aaab
(?<=a+)b
должен соответствовать b
в aaab
но вызывает ошибку в Python.
Захватывающие группы разрешены и работают так, как ожидалось, включая обратные ссылки. Однако сам lookahead / lookbehind не является группой захвата.
основы
Положительный lookahead (?=123)
утверждает, что за текстом следует данный шаблон, без включения шаблона в совпадение. Аналогично, положительный lookbehind (?<=123)
утверждает, что этому тексту предшествует данный шаблон. Заменив =
с !
отрицает утверждение.
Вход : 123456
-
123(?=456)
соответствует123
( положительный результат ) -
(?<=123)456
совпадений456
( положительный lookbehind ) -
123(?!456)
не работает ( отрицательный результат ) -
(?<!123)456
терпит неудачу ( отрицательный lookbehind )
Вход : 456
-
123(?=456)
не работает -
(?<=123)456
не удается -
123(?!456)
не работает -
(?<!123)456
совпадений456
Использование lookbehind для тестирования окончаний
В конце шаблона можно использовать lookbehind, чтобы обеспечить его окончание или нет.
([az ]+|[AZ ]+)(?<! )
соответствует последовательностям только строчных или только прописных слов, исключая конечные пробелы.
Имитация с переменной длиной lookbehind с \ K
Некоторые ароматы регулярных выражений (Perl, PCRE, Oniguruma, Boost) поддерживают только lookbehind с фиксированной длиной, но предлагают функцию \K
, которая может использоваться для имитации зависания переменной длины в начале шаблона. При столкновении с \K
согласованный текст до этой точки отбрасывается, и только текст, соответствующий части шаблона, следующей за \K
, сохраняется в конечном результате.
ab+\Kc
Эквивалентно:
(?<=ab+)c
В общем, шаблон вида:
(subpattern A)\K(subpattern B)
Концы заканчиваются похожими на:
(?<=subpattern A)(subpattern B)
За исключением случаев, когда подшаблон B может совпадать с тем же текстом, что и подзаголовок A, вы можете получить незначительно разные результаты, потому что подшаблон A все еще потребляет текст, в отличие от истинного lookbehind.