Опережающий просмотр регулярных выражений в Python

Содержание

Введение в опережающий просмотр регулярных выражений в Python

Иногда вам нужно найти X, но только если за ним следует Y. В этом случае вы можете использовать опережающий поиск (просмотр вперед) в регулярных выражениях Python: regex lookahead.

Синтаксис  данного просмотра следующий:

X(?=Y)

Он означает поиск X, но совпадение происходит только в том случае, если за ним следует Y.

Например, предположим, что у вас есть следующая строка:

'1 Python is about 4 feet long'

И вы хотите сопоставить число (4), за которым следует пробел, и буквальную строку foot, а не число 1. В этом случае вы можете использовать следующий шаблон, содержащий просмотр:

\d+(?=\s*feet)

В этом шаблоне:

  • \d+ — это комбинация набора символов цифр с квантификатором +, который соответствует одной или нескольким цифрам.
  • ?= — синтаксис просмотра вперед.
  • \s* — это комбинация набора символов пробелов и квантификатора *, которая соответствует нулю или более пробелам.
  • «футы» соответствуют буквальной строке «футы».

Следующий код использует приведенный выше шаблон для сопоставления числа, за которым следует ноль или более пробелов, а также буквальных строк:

import re

s = '1 Python is about 4 feet long'
pattern = '\d+(?=\s*feet)'

matches = re.finditer(pattern,s)
for match in matches:
    print(match.group())

Выход:

4

Множественный просмотр регулярных выражений

Regex позволяет вам иметь несколько просмотров вперед со следующим синтаксисом:

 X(?=Y)(?=Z)

В этом синтаксисе механизм регулярных выражений выполнит следующие шаги:

  1. Найти Х
  2. Проверьте, находится ли Y сразу после X, пропустите, если это не так.
  3. Проверьте, находится ли Z сразу после Y; пропустите, если это не так.
  4. Если оба теста пройдены, X соответствует; в противном случае найдите следующее совпадение.

Таким образом, шаблон X(?=Y)(?=Z) соответствует X, за которым следуют Y и Z одновременно.

Отрицательный regex lookahead

Предположим, вы хотите сопоставить только цифру 1 в следующем тексте, но не цифру 4:

'1 Python is about 4 feet long'

Для этого вы можете использовать синтаксис отрицательного просмотра вперед:

X(?!Y)

X(?!Y) соответствует X, только если за ним не следует Y. Это \d+, за которым не следует буквальная строка foot:

import re

s = '1 Python is about 4 feet long'
pattern = '\d+(?!\s*feet)'

matches = re.finditer(pattern,s)
for match in matches:
    print(match.group())

Выход:

1
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *