Привет, сегодня я расскажу тебя о регулярных выражения в 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/
Не забудьте поставить 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
Заключение
Чтобы лучше иучить regex вы можете по этим ссылочкам
Документация по модулю re(понятнее и мягче)
Про регулярные выражения на Хабре
Про флаги(python2)
А также 2 видео на эту тему
1 часть - https://www.youtube.com/watch?v=zHJUUmmmnU8
2 часть - https://www.youtube.com/watch?v=gH60YkI4xic
Пост был создан для тг-канала @coolcoders