Опережающий просмотр регулярных выражений в Python
- Введение в опережающий просмотр регулярных выражений в Python
- Множественный просмотр регулярных выражений
- Отрицательный regex lookahead
Введение в опережающий просмотр регулярных выражений в 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)
В этом синтаксисе механизм регулярных выражений выполнит следующие шаги:
- Найти Х
- Проверьте, находится ли Y сразу после X, пропустите, если это не так.
- Проверьте, находится ли Z сразу после Y; пропустите, если это не так.
- Если оба теста пройдены, 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