Модуль re

Модуль re позволяет работать нам с регулярными выражениями.

Регулярные выражения(Regular expression) - ормальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. Для поиска используется строка-образец ("шаблон", "маска"), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.

Если попроще, то регулярные выражения позволяют нам находить какие-то последовательности символов тексте, а для того чтобы описать эту последовательности используется специальный синтаксис описания маски.

Для того чтобы детальнее ознакомиться с синтаксисом шаблонов, советую ознакомиться со следующим видео:

Шпаргалка

Особые для python мета-символы

СимволОписание
?P<name>Именованная группа

Функции модуля

re.compile(pattern: str, flags=0) -> Pattern

Позволяет нам скомпилировать pattern в объект регулярного выражения, делается это для производительности и удобства.

HELLO_WORLD_RE = re.compile("Hello\s+?World")
match = HELLO_WORLD_RE.search("-Hello World-")
if match:
print(match.group(0))

re.search(pattern, string, flags=0) -> None | Match

Найти вхождение паттерна в строке, в любом месте. Метод возвращает объект совпадения Match

re.match(pattern, string, flags=0) -> None | Match

Найти вхождение паттерна в строке, в любом месте. Метод возвращает объект совпадения Match

re.fullmatch(pattern, string, flags=0) -> None | Match

Вернет объект совпадения если только pattern полностью совпадает со строкой

re.split(pattern, string, maxsplit=0, flags=0) -> List[str]

Разбить строку на подстроки по какому-то паттерну.

re.findall(pattern, string, flags=0) -> List[str]

Найти все вхождения паттерна в строке. Обратите внимание, что возвращается не список объектов класса Match a список строк.

TEXT = "hi hi hi"
HI_RE = re.compile("hi")
print(HI_RE.findall(TEXT)) # ['hi', 'hi', 'hi']

re.finditer(pattern, string, flags=0) -> Iterator[Match]

Возвращает итератор по Match объектам.

TEXT = "hi hi hi hi hi hi hi hi hi hi hi hi"
HI_RE = re.compile("hi")
for m in HI_RE.finditer(TEXT):
print(m)

re.sub(pattern, repl, string, count=0, flags=0) -> str

Удобный метод позволяющий сделать замену в строке.

class Pattern

Методы класса Pattern очень похожи на методы модуля re, за исключением того, что этим методам не надо передавать паттерн(шаблон).

class Match

Это объект совпадения из которого мы можем получить всю дополнительную информацию о нем.

Match.group([group1, ...])

Получение группы по ее индексу либо имени.

import re
PATTER_WITH_NAME = re.compile(r"^(?P<first_name>\w+?)\s+(?P<last_name>\w+?)$")
match = PATTER_WITH_NAME.match("John Dow")
first_name = match.group("first_name")
last_name = match.group("last_name")

Match.groups(default=None)

Получение всех подгрупп в виде tuple. Значит, что вернутся все подгруппы, но основная группа, с индексом 0 не вернется

import re
PATTER_WITH_NAME = re.compile(r"^(?P<first_name>\w+?)\s+(?P<last_name>\w+?)$")
match = PATTER_WITH_NAME.match("John Dow")
if match:
print(match.groups()) # ('John', 'Dow')

Match.groupdict(default=None)

Получить все именованные подгруппы в виде словаря(dict).

import re
PATTER_WITH_NAME = re.compile(r"^(?P<first_name>\w+?)\s+(?P<last_name>\w+?)$")
match = PATTER_WITH_NAME.match("John Dow")
if match:
print(match.groupdict()) # {'first_name': 'John', 'last_name': 'Dow'}

Match.start(group) и Match.end(group)

Получить позицию начала и конца группы в совпадении. Если группа не найдена - выскочит ошибка IndexError. Если группа объявлена, но не имеет совпадений в тексте - значением ее позиции будет -1.

import re
PATTER_WITH_NAME = re.compile(r"^(?P<first_name>\w+?)\s+(?P<last_name>\w+?)$")
match = PATTER_WITH_NAME.match("John Dow")
if match:
print(match.start("first_name")) # 0
print(match.end("first_name")) # 4
print(match.start("last_name")) # 5
print(match.end("last_name")) # 8

Match.span(group)

Объединяет в себе методы start и end и возвращает значения в виде tuple (start_index, end_index)

import re
PATTER_WITH_NAME = re.compile(r"^(?P<first_name>\w+?)\s+(?P<last_name>\w+?)$")
match = PATTER_WITH_NAME.match("John Dow")
if match:
print(match.start()) # 0
print(match.end()) # 8

Match.pos и Match.endpos - Значения pos, которые были указаны при вызове метода search или match.

Match.re - Ссылка на регулярное выражение.

Match.string - Ссылка на строку.