Создание и настройка шаблонов регулярных выражений
Что за регулярные выражения?
Регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Чтобы его использовать нужно импортировать модуль regular expression — import re. Как это работает на практике? Рассмотрим функцию findall
[code]import re
text = «»»
Привет, это санек. Хочу позвать всех своих друзей побухать на выходных. Для этого пошлю e-mail на
huk@manager.ru, pavel@dodo.ru, lisica@moyasemya.ru
«»»
# сначала найдем просто все слова
email = re.findall(«\w+», text) #нужно передать два параметра — шаблон (pattern) и строку (string)
# результатом будет список строк
print(email)
# чтобы получить список именно e-mail адресов нужно просто изменить шаблон
email = re.findall(«\w+@\w+.\w+», text)
print (email)
[/code]
Результат:
Другие шаблоны
[adace-ad id=»3482″]
Шаблон — это строка, которая включает в себя символы, которые в свою очередь означают, что в слове они могут присутствовать. Попробуем использовать другие шаблоны для для функции findall
. — любой символ (кроме переноса строки)
\d — обозначает символ цифры
\D — наоборот, любой символ, кроме цифры
\s — любой пробельный символ
\S — что угодно, кроме пробельного
\w — все символы от 0-9, a-z, A-Z, а-я, А-Я и нижнее подчеркивание _
\W — все остальные символы, например, пробельные или все спецсимволы
Например (можно использовать «\d+»)
Результат:
+ — это квантификатор. Это значит мы ищем символы идущие подряд. Т.е. ищем все цифры идущие подряд и получаем число
Настройка и создание шаблонов
Шаблоны можно подстраивать под самые различные ситуации. Мы уже знаем шаблон с обратным слэшем. Еще можно использовать шаблон с квантификатором ?. Это означает, что данный символ может быть на том месте, а может и нет. Как это выглядит?
[adace-ad id=»3475″]
? — символ или есть или его нет
* — символ может быть повторен ноль или множество раз
[code]import re
text = «»»
Привет, это санек.
Хочу позвать всех своих друзей побухать на своё день рождения в 2019 году, потому что в 2018 было ок
Потратили 802,65 на виски и 569,70 на пиццу — это 99,9% зарплаты санька, а может всего лишь 99%
или вообше 99,99999%
Для этого пошлю e-mail на huk@manager.ru, pavel@dodo.ru, lisica@moyasemya.ru
«»»
new = re.findall («\d+,\d+%», text) #этот код поможет найти проценты с запятой
print(new)
new2 = re.findall («\d+,?\d+%», text) # квартификатор ? означает, что запятая может быть, а может и нет
print(new2)
new3 = re.findall («\d+,?\d*%», text) # классификатор * — символ может быть повторен множество раз
print(new3)
[/code]
Результат:
Шаблон можно настроить иначе, написав в квадратных скобках перечень символов, которые должны входить в новую строку. Записать можно следующим образом:
Результат: (в первом случае результат с точкой в выборку не попал. Во втором мы подправили шаблон)
Взаимозаменяемые шаблоны
В паттернах регулярных выражений можно использовать взаимозаменяемые шаблоны, они будут разделятся вертикальной чертой — |. Скобками мы не только размечаем шаблон, но и указываем, какие символы нам не печатать при выводе — т.е. поиск проходит с процентом в том числе, но вывод покажет только цифры. Таким образом, то, что осталось за скобками — не выводится.
[adace-ad id=»3474″][code]
import re
text = «»»
Привет, это санек.
Хочу позвать всех своих друзей побухать на своё день рождения в 2019 году, потому что в 2018 было ок
Потратили 802,65 на виски и 569,70 на пиццу — это 99,9% зарплаты санька, а может всего лишь 99%
или вообше 99.99999%
«»»
new2 = re.findall(«[0-9,\.]+%», text)
print(new2)
# та же самая запись, сделанная с помощью взаимозаменяемого шаблона
# границы размечаем скобками
new3 = re.findall(«(\d+,?\d*| \d+\.?\d*)%», text)
print(new3)
Результат
Квантификатор количества повторений
Чтобы указать программе, какое точное количество символов будет встречаться в шаблоне, можно использовать квантификатор {}, который укажет точное количество. Например:
Результат:
Чтобы исключить ситуации, когда в фильтр попадают не нужные значения (например в фильтр … попадут слова с ….) можно использовать квантификатор «что угодно, кроме». Например, запись newtext = re.findall(«\w+\.{2,3}[^\.]», text) будет означать, что фильтр после троеточия не допускает еще один символ точки.
Функция re.sub
Чтобы изменять текст в коде существует регулярные выражения с функцией re.sub. Она принимает три аргумента: строка (шаблон, который мы хотим изменить), строка на которую мы меняем, источник текста)
[code]import re
text = «»»
Самый вкусный вискарик — это пряный вискарик. Lawsons держит марку
Lawsons — недорогой и вкусный
Саня проставится на др именно Lawsons
«»»
print(text)
text = re.sub(«Lawsons» , «Captain Morgan Black», text)
print(text)
[/code]
Результат:
Функция re.compile
Служит для создания объектов-шаблонов, чтобы подставлять их в привычные места (например, куда нужно передать аргумент в методе findall). Т.е вместо
re.findall (pattern, text)
Мы используем:
shablon = re.complie (pattern)
shablon.findall (some_text1)
shablon.findall (some_text2)
shablon.findall (some_text3)
Посмотрим на практике:
[code]import re
text1 = ‘Самый вкусный вискарик — это пряный вискарик. Lawsons держит марку’
text2 = ‘Lawsons — недорогой и вкусный’
text3 = ‘Саня проставится на др именно Lawsons’
new_pattern = re.compile(«Lawsons»)
print(re.sub(new_pattern, «Captain Morgan», text1))
print(re.sub(new_pattern, «Captain Morgan», text2))
print(re.sub(new_pattern, «Captain Morgan», text3))
Результат:
Функция re.search
Функция re.search отдаёт нам результат в виде его положения в тексте, где найдено значение (его первое вхождение), указанное в шаблоне (pattern). Возвращаемый объект имеет тип re.match
[code]import re
text1 = ‘Самый вкусный вискарик — это пряный вискарик. Lawsons держит марку’
text2 = ‘Lawsons — недорогой и вкусный’
text3 = ‘Саня проставится на др именно Lawsons’
new_pattern = «Lawsons»
print(re.search(new_pattern,text1))
print(re.search(new_pattern,text1).group())
print(type(re.search(new_pattern,text1)))
Результат:
