Оглавление
Предопределенные классы символов
re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
re.split(pattern, string, maxsplit=0, flags=0)
re.findall(pattern, string, flags=0)
re.finditer(pattern, string, flags=0)
Основы синтаксиса
aaa — простейшее РВ, которое соответствует строкам, содержащим aaa. . ^ $ * + ? { } [ ] \ | ( ) — специальные символы РВ. \$ \+ \{ — если хотите отменить «специальность» символа, его нужно экранировать \.
Наборы символов, диапазоны
[abc] — набор символов, читается как «ИЛИ a, ИЛИ b, ИЛИ c».
[6-9] — диапазон, читается как «ИЛИ 6, ИЛИ 7, ИЛИ 8, ИЛИ 9».
[a-z] — диапазон, читается как ЛЮБАЯ БУКВА английского алфавита.
[a-zA-Z] — ЛЮБАЯ БУКВА английского алфавита (любой регистр).
[^abc] — отрицания набора или диапазона, читается как «НЕ a, НЕ b, НЕ c».
Предопределенные классы символов
. — соответствует любому символу.
\s — соответствует любому «пробельному» символу
(например: пробел, символ табуляции, символ новой строки и т. д.).
\S — соответствует любому символу, который не относится к «пробельным».
\d — соответствует любому символу, который является цифрой (0–9).
\D — соответствует любому символу, который не является цифрой.
\w — соответствует любому символу, который является строковым символом (A-Z, a-z, 0–9 и _).
\W — соответствует любому символу, который не является строковым символом.
\t — соответствует символу табуляции.
\r — соответствует символу возврата каретки.
\n — соответствует символу новой строки.
Квантификаторы
это специальный ограничитель, который указывает количество возможных повторений символа, группы символов или класса символов, находящихся в регулярном выражении перед ним.
пф{1,3} — ф повторяется от одного до трех раз (пф, пфф, пффф).
пф{1,} — ф повторяется от одного до бесконечности.
пф{,3} — ф повторяется от нуля до трех.
пф{,3} — ф повторяется три раза = пффф.
пф? = пф{0,1}.
пф+ — пф{1,}.
пф* — пф{0,}.
Группы захвата и переменные
Группа () ничего не делает, позволяет сохранить внутренность в переменную. К переменным можно получить доступ с помощью синтаксиса: \1, \2, …, \9. Можно получить результат и использовать его в РВ. или Позволяет перечислять возможные допустимые варианты. Чем-то похоже на [], только там указываются допустимые символы, а здесь — некоторая последовательность символов. (999|925|906) читается как «ИЛИ 999, ИЛИ 925, ИЛИ 906».
Признаки (якоря)
^ — начало текста.
\b — начало или конец слова.
(\b\w+\b) — найти слова.
Регулярные выражения в Python
В Python для работы с регулярками есть модуль re.
re.compile(pattern, flags=0)
Функция компилирует РВ в объект, который можно использовать в методах match (), search () и других, описанных ниже.
Последовательность
prog = re.compile(pattern)
result = prog.match(string)
эквивалентна
result = re.match(pattern, string).
Поведение выражения можно изменить, указав значение флагов (flags).
Флаги можно объединять с помощью побитового ИЛИ (оператор |). Например:
re.IGNORECASE | re.DOTALL
Примеры флагов
re.IGNORECASE
Включает режим сопоставления без учета регистра; такие выражения, как [A-Z], также будут соответствовать строчным буквам [a-z].
re.DOTALL
Меняет поведение “.”. При включенном режиме . соответствует любому символу, включая новую строку; без этого флага '.' будет соответствовать чему угодно, кроме новой строки.
re.MULTILINE
Если этот флаг указан, символы '^' и '$' соответствуют началу/концу строки и началу/концу каждой строки (сразу после каждой новой строки). То есть текст разделяется на строки, и в тексте появляется несколько ^ $, а не только в начале и конце. По умолчанию '^' соответствует только началу строки, а '$' — только концу строки.
re.search(pattern, string, flags=0)
Просканирует строку в поисках первого совпадения с шаблоном регулярного выражения и вернет соответствующий объект совпадения. Вернет None, если никакая позиция в строке не соответствует шаблону.
re.match(pattern, string, flags=0)
Если символы в начале строки соответствуют шаблону регулярного выражения, то функция вернет объект match. Иначе верните None, если строка не соответствует шаблону. Обратите внимание, что даже в режиме MULTILINE re.match () будет рассматривать только первую строку.
re.split(pattern, string, maxsplit=0, flags=0)
Если в шаблоне используются захватывающие группы, то текст всех групп возвращается как часть результирующего списка. Если maxsplit отличен от нуля, происходит не более maxsplit-разбиений, а остаток строки возвращается как последний элемент списка.
Разделит строку по шаблону:
re.split(r',+', 'Words, words, words.')
>>> ['Words', ' words', ' words.']
re.findall(pattern, string, flags=0)
Возвращает все подходящие по шаблону строки в виде списка или кортежей. Входная строка просматривается слева направо, и совпадения возвращаются в найденном порядке. Результат зависит от количества групп захвата. Если групп нет, вернется список строк, соответствующих шаблону. Если присутствует несколько групп, то вернется список кортежей, соответствующих группам.
re.finditer(pattern, string, flags=0)
Вернется итератор, содержащий объекты match для шаблона в строке. Строка просматривается слева направо, и совпадения возвращаются в найденном порядке. Поведение совпадает с re.findall.
Декораторы
Декораторы — это «обертки», которые дают возможность изменить поведение функции, не изменяя ее код.
Синтаксис
@decor
def some_func():
pass
res = some_func()
Синтаксис выше эквивалентен:
def some_func2():
pass
some_func2_after_decor = decor(some_func2)
res = some_func2_after_decor()
Декоратор без параметров
def decor(func):
@wraps(func)
def _wrapper(*args, **kwargs):
return func(*args, **kwargs)
return _wrapper
Декоратор с параметром
def decor(some_arg):
def decor_inner(func):
@wraps(func)
def _wrapper(*args, **kwargs):
return func(*args, **kwargs)
return _wrapper
return decor_inner
Функция wraps
Это удобная функция при определении функции-оболочки.
>>> from functools import wraps
>>> def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print('Calling decorated function')
... return f(*args, **kwds)
... return wrapper
...
>>> @my_decorator
... def example():
... """Docstring"""
... print('Called example function')
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
>>> example.__doc__
'Docstring'
Без использования этой фабрики декораторов имя функции примера
было бы 'wrapper', и строка документации исходного example ()
была бы потеряна.