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

Обычные символы

my text
"my text"

'.' - любой символ

Выражение: "m. text"
Подходящие строки: "my text", "me text", "mm text" - ок

'?' - 0 или 1 вхождение предыдущего символа

Выражение: lks?h
Подходящие строки: "lksh", "lkh"

'*' - 0 или больше вхождений предыдущего символа

Выражение: "lks*h"
Подходящие строки: "lkh", "lksh", "lkh", "lkssh", "lkssssssh", ...

'+' - 1 или больше вхождений предыдущего символа

Выражение: "lks*h"
Подходящие строки: "lksh", "lkh", "lkssh", "lkssssssh", ...

'{x}' - ровно x повторений предыдущего символа

Выражение: "lks{4}h"
Подходящие строки: "lkssssh"

'{x,y}' - от x до y повторений предыдущего символа

Выражение: "lks{4,6}h"
Подходящие строки: "lkssssh", "lksssssh", "lkssssssh"

'[]' - любой символ из заданных

Выражение: "f[iauo]sh"
Подходящие строки: "fish", "fash", "fush", "fosh"
Выражение: "[a-z]"
Подходящие строки: "a", "b", "c", ...
Выражение: [-az]
Подходящие строки: "-", "a", "z"
[a-zA-Z5-8]

[^...] - любой символ кроме символов внутри

Выражение: [^a-zA-Z5-8]
Подходящие строки: "0", "-", "+" - ок
Непдходящие строки: "a", "8", "0-+" - не ок

Комбинации

f[ia]*sh
f[ia]sh, f[ia][ia]sh, f[ia][ia][ia]sh, ...

'^' - начало строки

Выражение: ^abc
Подходит: abcde
Не подходит: babc

'$' - конец строки

Выражение: abc$
Подходит: asdfababc
Не подходит: abcd

Экранирование

"[a-z]" - как найти такую строку?
Ответ:\[a-z\]

'\' - экранирует любой специальный символ

'|' - или

Выражение: abc|de
Подходящие строки: "abc", "de"
Выражение: a(bc|de)z
Подходящие строки: "abcz", "adez"

Классы символов

\b - начало слова или конец слова
\B - всё кроме \b
\s - любой пробельный символ
\S - всё кроме \s
\d - любая цифра
\D - всё кроме \d
\w - любая буква
\W - всё кроме \w

Флаги

(?i)a(bc|de)z - игнорировать регистр
(?m)a(bc|de)z - матч может занимать несколько строк, ^$ - начало и конец каждой строки
(?s) - . соответствует любому символу, в т.ч. \n
(?u) - включает юникод

(?imsu) - флаги можно группировать
In [33]:
import re

text = """+7(919) 771-67-43 20985  wertw +7(910) 263-12-55 фыва фждлоудт"""
for m in re.finditer('(\+7|8)(([- \(\)]*[0-9]){10})', text):
    print(m.group(0), m.start(0), m.end(0))
    print(m.group(3))
+7(919) 771-67-43 0 17
3
+7(910) 263-12-55 31 48
5
In [31]:
import re

text = """ +7(919) 771-67-43"""

# re.match ищет совпадение c начале строки
m = re.match('(\+7|8)([- \(\)]*[0-9]){10}', text)
print('match')
if m is not None:
    print(m.group(0))
    print(m.start(0))
    print(m.end(0))

# re.search ищет первое совпадение в строке
m = re.search('(\+7|8)([- \(\)]*[0-9]){10}', text)
print('search')
if m is not None:
    print(m.group(0))
    print(m.start(0))
    print(m.end(0))

# re.fullmatch ищет полное совпадение со строкой
m = re.fullmatch('(\+7|8)([- \(\)]*[0-9]){10}', text)
print('fullmatch')
if m is not None:
    print(m.group(0))
    print(m.start(0))
    print(m.end(0))
match
search
+7(919) 771-67-43
1
18
fullmatch
In [34]:
import re

# (...), (?P<group_name>...)
text = """+7(919) 771-67-43 20985  wertw +7(910) 263-12-55 фыва фждлоудт"""
for m in re.finditer('(\+7|8)(?P<number>([- \(\)]*[0-9]){10})', text):
    print(m.group(0), m.start(0), m.end(0))
    print(m.group('number'))
+7(919) 771-67-43 0 17
(919) 771-67-43
+7(910) 263-12-55 31 48
(910) 263-12-55
In [46]:
import re

text = """adflljsd 987 asdfadsf, asdf ,as fdfsas979 9873"""
# \1, \2, \3, ... - подстановка значения группы
new_text = re.sub(r"\b([0-9]+)\b", r"(\1)", text)
print(new_text)
adflljsd (987) asdfadsf, asdf ,as fdfsas979 (9873)