Python and regular expressions example

Регулярные выражения в Python: синтаксис, полезные функции и задачи

Исчерпывающий гайд по работе с мощным инструментом для анализа и обработки строк.

Иллюстрация: Оля Ежак для SKillbox Media

Иван Стуков

Само словосочетание «регулярные выражения» звучит непонятно и выглядит страшно, но на самом деле ничего сложного в работе с ними нет. В этой статье мы познакомим вас с их логикой и основными принципами и научим разговаривать на языке шаблонов. В хорошем смысле слова.

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

Представьте, что вы снова в школе, на уроке истории. Вам нужно решить итоговую контрольную работу по всем датам, которые проходили в четверти.

Но тут вас поджидает препятствие: все даты разбросаны по нескольким главам учебника по десятку страниц каждая. Читать полкниги в поисках нужных вам крупиц информации — такое себе удовольствие. Тем более когда каждая минута на счету.

К счастью, вы — человек неглупый (не зря же пошли в IT), тренированный и быстро соображающий. Поэтому моментально замечаете основные закономерности:

  • даты обозначаются цифрами: арабскими, если это год и месяц, и римскими, если век;
  • учебник — по истории позднего Средневековья и Нового времени, поэтому все даты, написанные арабскими цифрами, — четырёхсимвольные;
  • после римских цифр всегда идёт слово «век».

Теперь у вас есть шаблон нужной информации. Остаётся лишь пролистать страницу за страницей и записать даты в смартфон (или себе на подкорку). Вуаля: пятёрка за четверть у вас в дневнике, а премия от родителей за отличную учёбу — в кармане.

По такому же принципу работают и регулярные выражения: они ведут поиск фрагментов текста по определённому шаблону. Если фрагмент совпадает с шаблоном — с ним можно работать.

Запишем логику поиска исторических дат в виде регулярных выражений (они ещё называются Regular Expressions, сокращённо regex или regexp). Выглядеть он будет так:

Что же произошло? Почему найдено только одно совпадение, причем за него посчитали весь текст сразу? Всё дело в жадности квантификатора +, который старается захватить максимально возможное количество подходящих символов.

В итоге шаблон \w находит совпадение с буквой «Ф» в начале текста, шаблон \.\d находит совпадение с «.80» в конце текста, а всё, что между ними, покрывается шаблоном .+.

Чтобы квантификатор захватывал минимально возможное количество символов, его нужно сделать ленивым. В таком случае каждый раз, находя совпадение с шаблоном ., регулярное выражение будет спрашивать: «Подходят ли следующие символы в строке под оставшуюся часть шаблона?»

Если нет, то функция будет искать следующее совпадение с .. А если да, то . закончит свою работу и следующие символы строки будут сравниваться со следующей частью регулярного выражения: \.\d .

Чтобы объявить квантификатор ленивым, после него надо поставить символ ?. Сделаем ленивым квантификатор + в нашем регулярном выражении для поиска строк в оглавлении:

Теперь, когда мы уверены в правильности работы нашего регулярного выражения, используем функцию re.findall, чтобы выписать оглавление построчно:

Задача 3. Метод Довлатова

Писатели в поиске собственного неповторимого стиля нередко изобретают оригинальные творческие приёмы и неукоснительно им следуют. Например, Сергей Довлатов следил за тем, чтобы слова в предложении не начинались с одной и той же буквы.

Даны несколько предложений. Программа должна проверить, встречаются ли в каждом из них слова на одинаковую букву. Если таких нет, она печатает: «Метод Довлатова соблюдён». А если есть: «Вы расстроили Сергея Донатовича».

Важно. Чтобы регулярные выражения не рассматривали заглавные и прописные буквы как разные символы, передайте re-функции дополнительный аргумент flags=re.I или flags=re.IGNORECASE.

Ввод

Здесь все слова начинаются с разных букв.

А в этом предложении есть слова, которые всё-таки начинаются на одну и ту же букву.

А здесь совсем интересно: символ «а» однобуквенный.

Вывод

Вы расстроили Сергея Донатовича

Вы расстроили Сергея Донатовича

Чтобы указать на начало слова, используйте символ \b.

Чтобы в каждом совпадении regex не старалось захватить максимум, используйте ленивый пропуск.

Чтобы найти повторяющийся символ, используйте ссылку на группу в виде \1.

Читайте также:

Источник

Python and regular expressions example

Этот код вернет None , несмотря на то, что в строке есть 5 фрагментов «ку». Это происходит потому, что оба фрагмента расположены не в начале строки.

re.search() – находит первое вхождение фрагмента в любом месте и возвращает объект match. Если в строке есть другие фрагменты, соответствующие запросу, re.search их проигнорирует. У re.search есть дополнительные методы:

.span() – возвращает кортеж, содержащий начальную и конечную позиции искомого фрагмента.

.string – вернет строку, переданную в функцию re.search.

.group() – возвращает фрагмент строки, в котором было обнаружено совпадение.

<i data-lazy-src=

#Содержимое файла после выполнения кода: nov-14-2021 dec-15-2021 12-16-2021 dec-17-2021 jan-03-2022 JAN-10-2022 

Вводится последовательность строк. Нужно вывести строки, в которых фрагмент «кот» присутствует в качестве подстроки не менее 2 раз.

#Пример ввода кот-кот кот и кот котофей котейка кот кот и котенок 
import re import sys for line in sys.stdin: line = line.strip() if re.search(r"кот.*?кот", line): print(line) 

Дана последовательность строк. Нужно вывести те, в которых «кот» встречается в качестве отдельного слова.

#Пример ввода: кот в сапогах кошка и кот котофей котяра 
import re import sys for line in sys.stdin: line = line.rstrip() if re.search(r"\bкот\b", line): print(line) 
#Вывод кот в сапогах кошка и кот 

Вывести слова, состоящие из двух одинаковых слогов.

#Пример ввода тартар тик-так сносно варвар барабан 
import re import sys for line in sys.stdin: line = line.strip() if re.search(r"\b(\w+)\1\b", line): print(line) 
#Вывод тартар сносно варвар 

Вводится последовательность строк. В каждой строке нужно поменять местами две первые буквы в каждом слове, состоящем из двух и более букв.

#Пример ввода это пример текста в котором нужно поменять буквы 
import sys import re for line in sys.stdin: line = line.rstrip() print(re.sub(r'\b(\w)(\w)', r"\2\1", line)) 
#Вывод тэо рпимер еткста в октором унжно опменять убквы 

Напишите функцию для валидации мобильного номера в международном формате. Корректным считается представление номера в таком виде:

+7(912)15-16-896, 8(912)15-16-896 +79121516896, 89121516896 +7(912)151-68-96, 8(912)151-68-96 +7912-151-6896, 87912-151-6896 
import re pattern = re.compile(r'(\+7|8).*?(\d).*?(\d).*?(\d).*?(\d)') def isValid(number): if re.match(pattern, number): print("ДА") else: print("НЕТ") isValid(input()) 

Напишите программу для парсинга номеров телефонов с тестовой страницы .

import urllib.request from re import findall url = "http://www.summet.com/dmsi/html/codesamples/addresses.html" response = urllib.request.urlopen(url) data = response.read() s = data.decode() phones = findall("\(\d\) \d-\d", s) for number in phones: print(number) 

Нужно извлечь все имена и фамилии из текста.

import re s = 'На встрече присутствовали: профессор Владимир Успенский, физик-ядерщик Сергей Ковалев, президент клуба Владимир Медведев и космонавт Юрий Титов.' name = r"[А-Я][а-я]+,?\s+" last_name = r"[А-Я][а-я]+" persons = re.findall(name + last_name, s) for item in persons: print(item) 

Нужно получить URL всех png и jpg изображений, использованных на главной странице proglib.io:

import re import requests def getURL(text): urls = [] results = re.findall(r'(?:http\:|https\:)?\/\/.*\.(?:png|jpg)', text) for x in results: if not x.startswith('http:'): x = 'http:' + x urls.append(x) return urls def getImages(url): resp = requests.get(url) urls = getURL(resp.text) print('urls', urls) getImages('https://proglib.io') 

Заключение

Regex в Python – мощный, гибкий, но достаточно сложный инструмент. Регулярные выражения сложно составлять, поддерживать и редактировать. При работе с текстовыми файлами Regex чаще всего можно заменить методами строк, а при парсинге, в большинстве случаев, использование XPath и CSS-селекторов окажется более эффективным.

Материалы по теме

Читайте также:  Get full url python
Оцените статью