Найти в Дзене
@coolcoders

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

От coolcoders с любовью
Оглавление

Привет, сегодня я расскажу тебя о регулярных выражения в python.

Просто говоря, регулярные выражения - это инструмент для парсинга текстовой информации: html-документов, csv-таблиц, текстового файла или простого текста

Для начала давайте сократим это название

Regular expressions > Regex > Re

Итак, начнем

Для того, чтобы подключить модуль regex в python нужно написать

import re

Дальше пройдемся по тому, как парсить информацию

import re #Импортировать модуль(он встроен в сам язык) text = "sdvkiysdbcvuadshcnoaiudwvccvgyiwacaw" #Создаем текст lookFor = r"a" #Создаем парсер, который будет искать буквы a result = re.findall(lookFor, text) #Теперь создаем парсер, который #будет искать, то что мы указали в lookFor в тексте text for i in res: #Создаем цикл, который будет выводить все совпадения print(i)

Это самый простой парсер. Теперь я объясню все подробнее

Пройдемся по спецсимволам, которые мы будем указывать в lookFor

. ^ $ * + ? { } [ ] \ | ( )

По порядку:

. - Любой символ кроме перехода на следующую строку "\n"

lookFor = r"..." #Ищет 3 любых символа

^ - Ищет совпадение в начале строки

lookFor = r"^aa" #Ставим перед буквами, если вы не поняли почему, то #подумайте еще

$ - Тоже самое, что ^, только ищет совпадения в конце строки

lookFor = r"aa$" #Ставим после букв, если вы не поняли почему, то #подумайте еще

* - Оператор повторения. Означает 0(ноль) или более совпадений

lookFor = r"aa*" #То что находится в скобках будет упомянаться 0 или #более раз.

+ - Оператор повторения. Означает 1 или более совпадений

lookFor = r"aa+"

? - Оператор повторения. Означает 0 или 1 совпадение

lookFor = r"aa?" #Выведет либо aa, либо ничего

{} -Оператор повторения. Означает строгое кол-во совпад

lookFor = r"[aa]{2}" #Парсер будет искать упоминание aa именно 2 раза lookFor = r"[aa]{2, 4}" #Парсер будет искать упоминание aa от 2 до 4 #раз подряд lookFor = r"[aa]{2,} #Парсер будет искать упоминание aa от 2 и более #раз

[] - Обозначает класс символов

lookFor = r"[abc]" #Будет искать отдельно a, b и c

В квадратных скобках можно указать диапазон т. е. Не писать

[abcdefghi]

А написать

[a-i] #От a до i

\ - Указывает либо на специальный символ, такие как \w, \d, \b...(О них мы позже поговорим), либо используется для экранирования спец. символов, например вам в парсер нужно указать [], +, *. Но просто поставив их, они будут выполнять свои функции и не будут распознаваться парсером, как обычные символы. Но если мы поставим обратный слэш перед ними \[, \], \+, \*. То мы получим желаемое

lookFor = r"\+" #Будет искать + в тексте

| - Это оператор ИЛИ. Он выбирает из двух значений

lookFor = r"(a | b)" #Ищет в тексе a, если не находит, то ищет в тексе #b

() - Группировка символов

lookFor = r"(...) (aaa)" #Найдет 3 символа подряд и aaa после #пробела(или не найдет)

Далее рассмотрим специальные последовательности

\w - алфавитный символ [A-Z][a-z]

\W - Любой символ, кроме алфавитного

\d - Любая цифра [0-9]

\D - Любой символ кроме цифр

\s - Любой пробельный символ

\S - Любой символ, кроме пробела

\b - Соответствует пустой строке перед и после слова

\B - Любой символ, кроме пустой строки

\A - Соответствует символу в начале

\Z - Соответствует символу в конце

Все это вы можете попробовать на сайте https://regex101.com/

-2

Не забудьте поставить python

А теперь пройдемся по методам

compile()
match()
group()
search()
findall()
finditer()
start()
end()
span()
split()
sub()

compile() - конвертирует обычное выражение в парсер

a = "aa"
lookFor = re.compile(a)

Тоже самое, что

lookFor = r"aa"

match() - Определяет есть ли соответствие с текстом

lookFor = r"aa"

m = lookFor.match("bbbbbbbbb")
#Ищем совпадения print(m) #Выведет None т. к. совпадений нет

group() - Выводит строку совпадающую с lookFor или выведет "Совпадение не найдено"

lookFor = r"aa"

m = lookFor.match("bbbbbbbbb")
#Ищем совпадения if m: print("Совпадение найдено", m.group()) else: print("Совпадение не найдено")

search() - Ищет первое совпадение с lookFor

lookFor = r"aa"

m = re.search(lookFor, "aaghjsfgdufbs")

print(m[0])

findall() - Ищет все совпадения с lookFor

lookFor = r"aa"

res = re.findall(lookFor, "aashbufcy")

for i in res:
#Цикл, который перебирает все совпадения print(i)

finditer() - Ищет одно совпадение с lookFor

lookFor = r"aa"

res = re.finditer(lookFor, "aaddaa")

for i in m:
print(i[0])

start() - Выводит стартовую позицию совпадения

lookFor = r"aa"

m = lookFor.match("abcjkasfdasaa")

print(m.start())
#11

end() - Выводит конечную позицию совпадения

lookFor = r"aa"

m = lookFor.match("abcjkasfdasaa")

print(m.end())
#12

span() - Выводит стартовую и конечную позицию совпадения

lookFor = r"aa"

m = lookFor.match("abcjkasfdasaa")

print(m.span())
#(11, 12)

split() - Разделяет текст по подстрокам в lookFor

lookFor = r"a"

res = re.split(lookFor, "pythonaisatheabestalanguage")

print(res)
#выведет ['python', 'is', 'the', 'best', 'l', 'ngu', 'ge'] т. к. в слове language есть 2 буквы a

sub() - заменяет все строки lookFor на rep в тексте

lookFor = r"C"

rep = "Python"

res = re.sub(lookFor, rep, "C is the best language. C is not bad")

print(res)
#выведет Python is the best language. Python is not bad

Теперь поговорим о флагах компиляции

Флаги компиляции позволяют изменить некоторые аспекты работы регулярных выражений.

ASCII, A
UNICODE, U
DOTALL, S
IGNORECASE, I
LOCALE, L
MULTILINE, M
VERBOSE, X

ASCII, A - Заставляет использовать \w , \W , \b , \B , \s и \S только в ASCII, вместо Unicode.

UNICODE, U - Заставляет использовать \w , \W , \b , \B , \s и \S только в Unicode, вместо ASCII

Извините,я не нашел примеров с такими флагами. Да не особо то и искал. Но не думаю, что они вам пригодятся

DOTALL, D - Помните я говорил, что . соответствует всему, кроме перехода на следующую строку - "\n". Но с этим флагом будет иначе

lookFor = r"...."

text = """a

a"""

res = re.findall(lookFor, text, re.S)
#re.S - это обозначение флага #можно обозначить flags = re.DOTALL, но оно слишком длинное for i in res: print(i)

IGNORECASE, I - Этот флаг игнорирует регистр.

lookFor = r"aa"

res = re.findall(lookFor, "AA", re.I)

for i in res:
print(i)
#Выведет AA

LOCALE, L - Сделайте \w , \W , \b , \B и сопоставление без учета регистра зависимым от текущей локали. Этот флаг может использоваться только с байтовыми шаблонами. Использование этого флага не рекомендуется, поскольку механизм локали очень ненадежен, он обрабатывает только одну «культуру» за раз и работает только с 8-битными локалями. Сопоставление Unicode уже включено по умолчанию в Python 3 для шаблонов Unicode (str), и оно может обрабатывать различные локали / языки. Соответствует встроенному флагу (?L) .

Я тоже ничего не понял. Забейте на этот флаг и пошли дальше

MULTILINE, M - Смотрите, у нас есть оператор ^ и $(о них говорилось выше). И они соответствуют только одной строке. Но если мы поставим этот флаг, то эти операторы будут брать первые и последние символы с каждой строки

lookFor = r"^\w"

text = """abc
def
ghi"""

res = re.findall(lookFor, text, re.M)

for i in res:
print(i)

VERBOSE, X - Этот флаг позволяет добавить комментарии в регулярные выражения

lookFor = r""" \w #hbicvbhvf \w #bhjhvdvbgjub \w #jifhuhf8ih8ih""" res = re.findall(lookFor, "aaa", re.X) for i in res: print(i)

Так же расскажу еще о некоторых вещах

Скобки перечисления

(?:...)

Используются для перечисления значений, объясню все на примере

lookFor = r"(?:\w\w\d\d)+" #Будет искать подряд стоящие 2 буквы и цифры text = "Есть миг29а, ту154б. Некоторые делают даже миг29ту154ил86." res = re.findall(lookFor, text) for i in res: print(i) #Выведет иг29 ту15 иг29ту15 ил86

А если написать просто

lookFor = r"(\w\w\d\d)+" #Будет искать подряд стоящие 2 буквы и цифры text = "Есть миг29а, ту154б. Некоторые делают даже миг29ту154ил86." res = re.findall(lookFor, text) for i in res: print(i) #Ты выведет иг29 ту15 иг29 ил86

Ну и в конце поговорим про Сложные шаблоны, соответствующие позиции (lookaround и Co)

(?=...)
(?!...)
(?<=...)
(?<!...)

Объясню все сразу на примере, а иначе будет не поятно

Возьмем в пример королей и императоров Франции

КарлIV, КарлIX, КарлVI, КарлVII, КарлVIII, ЛюдовикIX, ЛюдовикVI, ЛюдовикVII, ЛюдовикVIII, ЛюдовикX, ..., ЛюдовикXVIII, ФилиппI, ФилиппII, ФилиппIII, ФилиппIV, ФилиппV, ФилиппVI

-3
-4
-5
-6

Заключение

Чтобы лучше иучить regex вы можете по этим ссылочкам

Документация по модулю re

Документация по модулю re(понятнее и мягче)

Про регулярные выражения на Хабре

Про флаги(python2)

А также 2 видео на эту тему

1 часть - https://www.youtube.com/watch?v=zHJUUmmmnU8

2 часть - https://www.youtube.com/watch?v=gH60YkI4xic

Пост был создан для тг-канала @coolcoders