Connect with us

Обучение

Заметки Python #11: Регулярные выражения, шаблоны

274

 

Создание и настройка шаблонов регулярных выражений

Что за регулярные выражения?

Регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Чтобы его использовать нужно импортировать модуль 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)

[/code]

 

Результат

Квантификатор количества повторений

Чтобы указать программе, какое точное количество символов будет встречаться в шаблоне, можно использовать квантификатор {}, который укажет точное количество. Например:

Результат:

Чтобы исключить ситуации, когда в фильтр попадают не нужные значения (например в фильтр … попадут слова с ….) можно использовать квантификатор «что угодно, кроме». Например, запись 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))

[/code]

Результат:

Функция 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)))

[/code]

 

Результат:

Нажмите что бы оставить комментарий

Ответить

Ваш адрес email не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

Телевидение Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

Ноутбуки Asus не видят жесткий диск. Автоматический вход в BIOS при старте

Гаджеты

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

Advertisement Яндекс.Метрика

Digital2.ru - Тренды, Профессии IT, WEB- разработка, Вакансии, Автоматизация, Цифровая экономика
Свободное копирование и распространение материалов с сайта Digital2.ru
разрешено только с указанием активной ссылки на Digital2 как на источник.
Copyright 2018 - 2020 © All rights reserved

OPGIO.COM

Connect