Оглавление

Основы синтаксиса

Наборы символов, диапазоны

Предопределенные классы символов

Квантификаторы

Группы захвата и переменные

Признаки (якоря)

Регулярные выражения в Python

re.compile(pattern, flags=0)

Примеры флагов

re.IGNORECASE

re.DOTALL

re.MULTILINE

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)

Декораторы

Синтаксис

Декоратор без параметров

Декоратор с параметром

Функция wraps

Основы синтаксиса

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 ()
была бы потеряна.
                
© 2023 Все права защищены