Python RegEx: практическое применение регулярок
Разберём регулярные выражения в Python, их синтаксис, популярные методы специального модуля re, а также попрактикуемся на задачах.
Рассмотрим регулярные выражения в Python, начиная синтаксисом и заканчивая примерами использования.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
- Основы регулярных выражений
- Регулярные выражения в Python
- Задачи
Основы регулярных выражений
Регулярками в Python называются шаблоны, которые используются для поиска соответствующего фрагмента текста и сопоставления символов.
Грубо говоря, у нас есть input-поле, в которое должен вводиться email-адрес. Но пока мы не зададим проверку валидности введённого email-адреса, в этой строке может оказаться совершенно любой набор символов, а нам это не нужно.
Чтобы выявить ошибку при вводе некорректного адреса электронной почты, можно использовать следующее регулярное выражение:
r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)+$'
По сути, наш шаблон — это набор символов, который проверяет строку на соответствие заданному правилу. Давайте разберёмся, как это работает.
Синтаксис RegEx
Синтаксис у регулярок необычный. Символы могут быть как буквами или цифрами, так и метасимволами, которые задают шаблон строки:
Также есть дополнительные конструкции, которые позволяют сокращать регулярные выражения:
- \d — соответствует любой одной цифре и заменяет собой выражение [0-9];
- \D — исключает все цифры и заменяет [^0-9];
- \w — заменяет любую цифру, букву, а также знак нижнего подчёркивания;
- \W — любой символ кроме латиницы, цифр или нижнего подчёркивания;
- \s — соответствует любому пробельному символу;
- \S — описывает любой непробельный символ.
Для чего используются регулярные выражения
- для определения нужного формата, например телефонного номера или email-адреса;
- для разбивки строк на подстроки;
- для поиска, замены и извлечения символов;
- для быстрого выполнения нетривиальных операций.
Синтаксис таких выражений в основном стандартизирован, так что вам следует понять их лишь раз, чтобы использовать в любом языке программирования.
Примечание Не стоит забывать, что регулярные выражения не всегда оптимальны, и для простых операций часто достаточно встроенных в Python функций.
Хотите узнать больше? Обратите внимание на статью о регулярках для новичков.
Регулярные выражения в Python
В Python для работы с регулярками есть модуль re . Его нужно просто импортировать:
import re
А вот наиболее популярные методы, которые предоставляет модуль:
- re.match()
- re.search()
- re.findall()
- re.split()
- re.sub()
- re.compile()
Рассмотрим каждый из них подробнее.
re.match(pattern, string)
Этот метод ищет по заданному шаблону в начале строки. Например, если мы вызовем метод match() на строке «AV Analytics AV» с шаблоном «AV», то он завершится успешно. Но если мы будем искать «Analytics», то результат будет отрицательный:
import re result = re.match(r'AV', 'AV Analytics Vidhya AV') print result Результат:
Искомая подстрока найдена. Чтобы вывести её содержимое, применим метод group() (мы используем «r» перед строкой шаблона, чтобы показать, что это «сырая» строка в Python):
result = re.match(r'AV', 'AV Analytics Vidhya AV') print result.group(0) Результат: AV
Теперь попробуем найти «Analytics» в данной строке. Поскольку строка начинается на «AV», метод вернет None :
result = re.match(r'Analytics', 'AV Analytics Vidhya AV') print result Результат: None
Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.
result = re.match(r'AV', 'AV Analytics Vidhya AV') print result.start() print result.end() Результат: 0 2
Эти методы иногда очень полезны для работы со строками.
re.search(pattern, string)
Метод похож на match() , но ищет не только в начале строки. В отличие от предыдущего, search() вернёт объект, если мы попытаемся найти «Analytics»:
result = re.search(r'Analytics', 'AV Analytics Vidhya AV') print result.group(0) Результат: Analytics
Метод search() ищет по всей строке, но возвращает только первое найденное совпадение.
re.findall(pattern, string)
Возвращает список всех найденных совпадений. У метода findall() нет ограничений на поиск в начале или конце строки. Если мы будем искать «AV» в нашей строке, он вернет все вхождения «AV». Для поиска рекомендуется использовать именно findall() , так как он может работать и как re.search() , и как re.match() .
result = re.findall(r'AV', 'AV Analytics Vidhya AV') print result Результат: ['AV', 'AV']
re.split(pattern, string, [maxsplit=0])
Этот метод разделяет строку по заданному шаблону.
result = re.split(r'y', 'Analytics') print result Результат: ['Anal', 'tics']
В примере мы разделили слово «Analytics» по букве «y». Метод split() принимает также аргумент maxsplit со значением по умолчанию, равным 0. В данном случае он разделит строку столько раз, сколько возможно, но если указать этот аргумент, то разделение будет произведено не более указанного количества раз. Давайте посмотрим на примеры Python RegEx:
result = re.split(r'i', 'Analytics Vidhya') print result Результат: ['Analyt', 'cs V', 'dhya'] # все возможные участки.
result = re.split(r'i', 'Analytics Vidhya',maxsplit=1) print result Результат: ['Analyt', 'cs Vidhya']
Мы установили параметр maxsplit равным 1, и в результате строка была разделена на две части вместо трех.
re.sub(pattern, repl, string)
Ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.
result = re.sub(r'India', 'the World', 'AV is largest Analytics community of India') print result Результат: 'AV is largest Analytics community of the World'
re.compile(pattern, repl, string)
Мы можем собрать регулярное выражение в отдельный объект, который может быть использован для поиска. Это также избавляет от переписывания одного и того же выражения.
pattern = re.compile('AV') result = pattern.findall('AV Analytics Vidhya AV') print result result2 = pattern.findall('AV is largest analytics community of India') print result2 Результат: ['AV', 'AV'] ['AV']
До сих пор мы рассматривали поиск определенной последовательности символов. Но что, если у нас нет определенного шаблона, и нам надо вернуть набор символов из строки, отвечающий определенным правилам? Такая задача часто стоит при извлечении информации из строк. Это можно сделать, написав выражение с использованием специальных символов. Вот наиболее часто используемые из них:
На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Больше информации по специальным символам можно найти в документации для регулярных выражений в Python 3.
Перейдём к практическому применению Python регулярных выражений и рассмотрим примеры.
Задачи
Вернуть первое слово из строки
Сначала попробуем вытащить каждый символ (используя . )
result = re.findall(r'.', 'AV is largest Analytics community of India') print result Результат: ['A', 'V', ' ', 'i', 's', ' ', 'l', 'a', 'r', 'g', 'e', 's', 't', ' ', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', ' ', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', ' ', 'o', 'f', ' ', 'I', 'n', 'd', 'i', 'a']
Для того, чтобы в конечный результат не попал пробел, используем вместо . \w .
result = re.findall(r'\w', 'AV is largest Analytics community of India') print result Результат: ['A', 'V', 'i', 's', 'l', 'a', 'r', 'g', 'e', 's', 't', 'A', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'c', 'o', 'm', 'm', 'u', 'n', 'i', 't', 'y', 'o', 'f', 'I', 'n', 'd', 'i', 'a']
Теперь попробуем достать каждое слово (используя * или + )
result = re.findall(r'\w*', 'AV is largest Analytics community of India') print result Результат: ['AV', '', 'is', '', 'largest', '', 'Analytics', '', 'community', '', 'of', '', 'India', '']
И снова в результат попали пробелы, так как * означает «ноль или более символов». Для того, чтобы их убрать, используем + :
result = re.findall(r'\w+', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']
Теперь вытащим первое слово, используя ^ :
result = re.findall(r'^\w+', 'AV is largest Analytics community of India') print result Результат: ['AV']
Если мы используем $ вместо ^ , то мы получим последнее слово, а не первое:
result = re.findall(r'\w+$', 'AV is largest Analytics community of India') print result Результат: [‘India’]
Вернуть первые два символа каждого слова
Вариант 1: используя \w , вытащить два последовательных символа, кроме пробельных, из каждого слова:
result = re.findall(r'\w\w', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'la', 'rg', 'es', 'An', 'al', 'yt', 'ic', 'co', 'mm', 'un', 'it', 'of', 'In', 'di']
Вариант 2: вытащить два последовательных символа, используя символ границы слова ( \b ):
result = re.findall(r'\b\w.', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'la', 'An', 'co', 'of', 'In']
Вернуть домены из списка email-адресов
Сначала вернём все символы после «@»:
result = re.findall(r'@\w+', 'abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz') print result Результат: ['@gmail', '@test', '@analyticsvidhya', '@rest']
Как видим, части «.com», «.in» и т. д. не попали в результат. Изменим наш код:
result = re.findall(r'@\w+.\w+', 'abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz') print result Результат: ['@gmail.com', '@test.in', '@analyticsvidhya.com', '@rest.biz']
Второй вариант — вытащить только домен верхнего уровня, используя группировку — ( ) :
result = re.findall(r'@\w+.(\w+)', 'abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz') print result Результат: ['com', 'in', 'com', 'biz']
Извлечь дату из строки
Используем \d для извлечения цифр.
result = re.findall(r'\d-\d-\d', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') print result Результат: ['12-05-2007', '11-11-2011', '12-01-2009']
Для извлечения только года нам опять помогут скобки:
result = re.findall(r'\d-\d-(\d)', 'Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') print result Результат: ['2007', '2011', '2009']
Извлечь слова, начинающиеся на гласную
Для начала вернем все слова:
result = re.findall(r'\w+', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'largest', 'Analytics', 'community', 'of', 'India']
А теперь — только те, которые начинаются на определенные буквы (используя [] ):
result = re.findall(r'[aeiouAEIOU]\w+', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'argest', 'Analytics', 'ommunity', 'of', 'India']
Выше мы видим обрезанные слова «argest» и «ommunity». Для того, чтобы убрать их, используем \b для обозначения границы слова:
result = re.findall(r'\b[aeiouAEIOU]\w+', 'AV is largest Analytics community of India') print result Результат: ['AV', 'is', 'Analytics', 'of', 'India']
Также мы можем использовать ^ внутри квадратных скобок для инвертирования группы:
result = re.findall(r'\b[^aeiouAEIOU]\w+', 'AV is largest Analytics community of India') print result Результат: [' is', ' largest', ' Analytics', ' community', ' of', ' India']
В результат попали слова, «начинающиеся» с пробела. Уберем их, включив пробел в диапазон в квадратных скобках:
result = re.findall(r'\b[^aeiouAEIOU ]\w+', 'AV is largest Analytics community of India') print result Результат: ['largest', 'community']
Проверить формат телефонного номера
Номер должен быть длиной 10 знаков и начинаться с 8 или 9. Есть список телефонных номеров, и нужно проверить их, используя регулярки в Python:
li = ['9999999999', '999999-999', '99999x9999'] for val in li: if re.match(r'[8-9][0-9]', val) and len(val) == 10: print 'yes' else: print 'no' Результат: yes no no
Разбить строку по нескольким разделителям
line = 'asdf fjdk;afed,fjek,asdf,foo' # String has multiple delimiters (";",","," "). result = re.split(r'[;,\s]', line) print result Результат: ['asdf', 'fjdk', 'afed', 'fjek', 'asdf', 'foo']
Также мы можем использовать метод re.sub() для замены всех разделителей пробелами:
line = 'asdf fjdk;afed,fjek,asdf,foo' result = re.sub(r'[;,\s]',' ', line) print result Результат: asdf fjdk afed fjek asdf foo
Извлечь информацию из html-файла
Допустим, нужно извлечь информацию из html-файла, заключенную между
, кроме первого столбца с номером. Также будем считать, что html-код содержится в строке.
Пример содержимого html-файла:
1NoahEmma2LiamOlivia3MasonSophia4JacobIsabella5WilliamAva6EthanMia7MichaelEmily
С помощью регулярных выражений в Python это можно решить так (если поместить содержимое файла в переменную test_str ):
result = re.findall(r'\d([A-Z][A-Za-z]+)([A-Z][A-Za-z]+)', test_str) print result Результат: [('Noah', 'Emma'), ('Liam', 'Olivia'), ('Mason', 'Sophia'), ('Jacob', 'Isabella'), ('William', 'Ava'), ('Ethan', 'Mia'), ('Michael', 'Emily')]
Регулярные выражения в Python для новичков
У вас когда-нибудь возникала потребность в поиске строк, слов или даже символов в тексте?
В этой статье вы узнаете о регулярных выражениях в Python и научитесь работать с модулем «re», который позволяет совершать массу сравнительных и поисковых действий с текстом!
Что такое регулярное выражение?
Регулярное выражение – это средство работы с текстом, которое позволяет по заданному «паттерну» искать и редактировать искомое слово/строку в тексте.

Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Импортируем модуль «re»
Для начала работы нам нужно импортировать модуль.
Модуль «re» устанавливать не нужно, он устанавливается вместе с самим Python. Нам лишь нужно импортировать его в проект.
Для этого в начале строки пропишем:
import re
Основные регулярные выражения
re.match() – ищет совпадения в тексте, по умолчанию в начале строки.
import re pattern = ‘34’ testString = ’12 timeweb 34 community 58’ result = re.search(pattern, testString) print(result) # Результат None, если совпадения будут обнаружены - result вернет их.
re.findall() – возвращает все строки, где было обнаружено совпадение.
import re pattern = ‘\d+’ (ищем только числа с помощью метасимволов, об этом далее) testString = ’12 timeweb 34 community 58’ result = re.findall(pattern, testString) print(result) # Результат [‘12’, ‘34’, ‘58’], если совпадения не будут обнаружены - то []
re.split() – разбивает строки по заданному паттерну и возвращает разбитые строки.
import re pattern = ‘\d+’ testString = ’12 timeweb 34 community 58’ result = re.split(pattern, testString) print(result) # Результат [‘timeweb’, ‘community’], если совпадения не будут обнаружены - то []
re.sub() – заменяет символы по заданному паттерну на заданные символы и возвращает исправленную строку.
import re pattern = ‘timeweb’ replace = ‘hello’ testString = ’timeweb community of timeweb community’ result = re.sub(pattern, replace, testString) print(result) # Результат ‘hello community of hello community’, если совпадения не будут обнаружены, то вернется первоначальная строка.
re.search() – ищет указанный паттерн в строке и при первом же совпадении возвращает сам паттерн, в ином же случае возвращает None.
import re pattern = ‘34’ testString = ’12 timeweb 34 community 58’ result = re.search(pattern, testString) print(result) # Результат ‘34’, если совпадения не будут обнаружены - None.
Метасимволы
Давайте рассмотрим примеры использования метасимволов, которые есть в модуле.
К примеру, нам нужно найти слова car, cat и cab.
Дабы не нагромождать наш код, мы можем просто использовать квадратные скобки. В таком случае переменную мы запишем так:
pattern = ‘ca[rtb] ’
Либо же мы можем указать диапазон символов:
pattern = ‘ca[a-e] ‘ (заменяет [abcde]) pattern = ‘ca[1-5] ’ (заменяет [12345]) # Вы можете искать обратные указанным вами символам. # К примеру ‘[^0-9]’ ищет любые символы, кроме чисел; # ‘[0-9]’ ищет все числа.
Также мы можем обозначить, с какой стороны искать совпадения!
pattern = ‘^timeweb’ - ищет в начале pattern = ‘timeweb$’ - ищет в конце
Мы можем обозначить нужное количество символов с помощью периода.
pattern = ‘tim. ’ - ищет tim и следующие три символа в начале
А еще метасимволы можно комбинировать!
pattern = ‘^t. b$’ # Найдет совпадение, если в строке 7 символов, # первым из которых является t, а последним b.
Краткие замены некоторым метасимволам
- \d — ищет числа в тексте, заменяет [0-9].
- \D — ищет любые символы кроме чисел в тексте, заменяет ‘[^0-9]’.
- \s — находит совпадения при наличии пробелов в тексте.
- \S — находит совпадения при отсутствии пробелов в тексте.
Надеюсь, что данная статья помогла вам разобраться с основами регулярных выражений в Python. Спасибо за внимание!
Регулярные выражения в Python: инструкция, примеры и практика

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

Освойте профессию
«Python-разработчик»
Что такое регулярные выражения?
Регулярные выражения представляют собой мощные шаблоны для поиска фрагментов в тексте. К примеру, в коде Python-программы есть форма регистрации пользователей. Для регистрации надо обязательно ввести адрес электронной почты. При этом в поле можно ввести совершенно любую строку и нарушить работу программы. Поэтому каким-то образом надо проверить валидность данных.
Python-разработчик
Освойте Python, самый популярный язык программирования
3 075 ₽/мес 6 150 ₽/мес

Первая идея — проверять строку на наличие символа at (@), ведь он есть в каждом адресе электронной почты, но пользователь может ввести email@. Символ есть, но это все еще не адрес электронной почты. Регулярные выражения в Python — это шаблоны, по которым можно проверять валидность данных, искать совпадения в тексте или заменять определенные фрагменты . Плюс таких выражений в том, что они поддерживаются практически во всех языках программирования. Изучив основной принцип работы, можно будет писать «регулярки» в коде любого другого проекта. Регулярное выражение для проверки валидности адреса электронной почты в Python будет выглядеть так:
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]$'
Напишем код небольшой функции для проверки валидности адресов электронной почты. Наше регулярное выражение поместим в переменную email_pattern, с помощью функции match() будем искать совпадения и возвращать True или False, в зависимости от того, является ли строка адресом электронной почты.
import re email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]$' def is_valid_email(email): return re.match(email_pattern, email) is not None
Теперь создадим несколько переменных с адресами и проверим каждый нашей функцией:
email1 = "user@example.com" email2 = "invalid_email@" email3 = "another.user123@subdomain.domain" print(is_valid_email(email1)) # True print(is_valid_email(email2)) # False print(is_valid_email(email3)) # True
Наше регулярное выражение может проверять не только простые адреса типа user@example.com, но и более сложные с поддоменами. Важно отметить, что сам процесс проверки валидности адресов электронной почты не самый простой. Все из-за того, что существует множество доменных зон и вариантов записи имени пользователя.

Станьте разработчиком на Python и решайте самые разные задачи: от написания кода до автоматизации процессов
Регулярные выражения в Python
Регулярные выражения или RegEx — строки, задающие шаблон для поиска фрагментов в тексте. По сути, RegEx можно назвать узкоспециализированным языком программирования, встроенным в Python. У регулярных выражений есть свой строгий синтаксис, набор функций для проверки совпадений и изменения исходной строки. В Python регулярные выражения доступны в модуле re, который необходимо импортировать в начале файла с помощью import re. Для экранирования обычно используют символ обратного слэша (\) или raw-строки (r»). Рекомендуется использовать второй способ, так как в больших регулярных выражениях и так будет довольно много слэшей.
Читайте также Как стать Python-разработчикоми начать зарабатывать в IT от 80 000 ₽
Функции регулярных выражений в Python
re.match() — поиск вхождения шаблона в начало строки. В качестве аргументов требуется передать сначала шаблон, а потом строку для проверки:
import re str = "Банкиров ребрендили-ребрендили-ребрендили, да не выребрендировали" print(re.match(r'ре', str))
- .group() — возвращает тот фрагмент строки, в котором нашлось совпадение;
- .span() — возвращает кортеж с начальной и конечной позицией искомого шаблона;
- .string() — возвращает строку, которую передали в re.search().
re.findall() — поиск всех вхождений шаблона в любом месте строки:
import re str = "Банкиров ребрендили-ребрендили-ребрендили, да не выребрендировали" print(re.findall(r'ре', str, re.IGNORECASE)) >>> ['ре', 'ре', 'ре', 'ре', 'ре', 'ре', 'ре', 'ре']
re.sub() — заменяет фрагменты в соответствии с шаблоном:
import re string = "шел дождь и два студента" result = re.sub(r'два', 'три', string) print(result) >>> шел дождь и три студента
re.split() — разделяет строку по шаблону, количество разделений задается числом:
import re string = "шел дождь и два студента" result = re.split(r' ', string, 4) print(result) >>> ['шел', 'дождь', 'и', 'два', 'студента']
import re string = "шел дождь и два студента" result = re.split(r' ', string, 1) print(result) >>> ['шел', 'дождь и два студента']
Эти функции реализуют базовые возможности регулярных выражений в Python.
Метасимволы регулярных выражений в Python
В примерах выше мы использовали регулярные выражения для поиска конкретных слов и слогов, но возможности технологии предоставляют работу с более продвинутыми шаблонами. К примеру, можно искать последовательности символов или любые символы из заданного диапазона. Сделать это можно с помощью специальных метасимволов.
| Метасимвол | Зачем нужен | Как использовать |
| . | Задает один произвольный символ, кроме новой строки | E.am.le |
| […] | Любой символ в скобках, сами символы можно задавать с помощью перечислений или диапазонов | [123abc] — только указанные символы[A-Za-z0-9] — весь английский алфавит и цифры[А-ЯЁа-яё0-9] — весь русский алфавит и цифры |
| [^…] | Любой символ, исключая указанные в скобках, сами символы можно задавать с помощью перечислений или диапазонов | [^A-Za-z] |
| ^ | Начало строки | ^Hello |
| $ | Конец строки | Hello$ |
| | | Логический оператор ИЛИ. Поиск одного из нескольких указанных вариантов | [0-9]|[IVXLCDM] — арабские или римские цифры |
| \ | Экранирование, с помощью которого Python понимает, является ли следующий символ обычным или специальным. Можно обычные символы превращать в метасимволы и обратно | \[\.\] — метасимволы становятся обычными\d\W\A — обычные символы становятся метасимволами |
| * | Произвольное число повторений одного символа | Hello* |
| ? | Строго одно повторение символа | Hello? |
| (…) | Группировка символов в скобках | ([A-Z][A-Za-z]+) |
| Число повторений предыдущего символа | Hello — строка четыре раза подрядHello — строка от одного до четырех раз подрядHello — строка от четырех раз подрядHello — строка от нуля до четырех раз подряд |
Важно отметить, что буквы «Ё» и «ё» не входят в диапазоны [А-Я] и [а-я]. Поэтому их надо отдельно включать, иначе регулярное выражение будет работать с ошибками.
Выше мы говорили про то, что обратный слэш (\) может превращать метасимволы в обычные и наоборот. К примеру, обычная точка (.) будет обозначать произвольный символ, а точка с обратным слэшем (\.) — просто точку. Такой принцип работает и с буквами латинского алфавита, которые становятся метасимволами.
| Символ | Зачем нужен |
| \d | Любая цифра, заменяет собой запись [0-9] |
| \D | Исключает все цифры, заменяет собой запись [^0-9] |
| \s | Любой пробельный символ, включая пробел, табуляцию, новую строку и возврат каретки |
| \S | Любой символ, исключая пробельный |
| \w | Любая буква, цифра и знак нижнего подчеркивания (_) |
| \W | Любой символ, кроме буквы, цифры и нижнего подчеркивания |
| \A | Начало строки, заменяет собой запись ^ |
| \Z | Конец строки, заменяет собой запись $ |
| \b | Начало или конец слова |
| \B | Середина слова |
| \n | Новая строка |
| \t | Табуляция |
| \r | Возврат каретки |
Флаги регулярных выражений в Python
Расширить возможность регулярных выражений в Python можно с помощью специальных флагов, которые передаются в функцию. С флагом re.IGNORECASE, игнорирующим регистр символов, мы уже познакомились выше. Но есть и другие флаги, ускоряющие работу с «регулярками».
| Краткая запись флага | Полная запись флага | Зачем нужен |
| re.I | re.IGNORECASE | Игнорирует регистр символов |
| re.A | re.ASCII | Возвращает совпадения только по таблице ASCII-символов |
| re.X | re.VERBOSE | Позволяет использовать комментарии в регулярных выражениях |
| re.S | re.DOTALL | Метасимвол точка (.) возвращает совпадения по всем символам, включая новую строку. |
| re.L | re.LOCALE | Добавляет к \w, \W, \b, \B, \s и \S региональные настройки, но работает только с байтовыми строками |
| re.M | re.MULTILINE | Возвращает совпадения в начале каждой новой строки, если используется с ^, и в конце каждой новой строки — если с $ |
Практические задачи
В регулярных выражениях мало теории, и освоить ее может даже новичок, который уже уверенно пишет простой код на Python. Больше времени уйдет, чтобы довести до автоматизма навык составлять сложные регулярные выражения. Еще больше усилий надо будет приложить, чтобы научиться читать и понимать чужие «регулярки». Добиться этого можно только с помощью постоянной практики.
На начальных этапах можно пользоваться подсказками и подсматривать в таблицы метасимволов. Обязательно надо обращать внимание на вывод программы, чтобы понимать, какие фрагменты выбираются по шаблонам, и корректировать код. В этом разделе рассмотрим несколько простых задач, которые помогут освоить базовые принципы работы с регулярными выражениями в Python. Постарайтесь придумать свое решение перед тем, как смотреть разбор.
Задача 1
Вернуть первое слово из строки «Регулярные выражения в Python».
Для решения задачи будем использовать функцию re.findall(), которая ищет все вхождения шаблона в любом месте строки. Для начала вернем каждый символ исходной строки с помощью символа точки (.):
import re string = "Регулярные выражения в Python" result = re.findall(r'.', string) print(result) >>> ['Р', 'е', 'г', 'у', 'л', 'я', 'р', 'н', 'ы', 'е', ' ', 'в', 'ы', 'р', 'а', 'ж', 'е', 'н', 'и', 'я', ' ', 'в', ' ', 'P', 'y', 't', 'h', 'o', 'n']
Если обратить внимание на вывод программы, то можно заметить, что в результат попали пробелы. Все из-за того, что символ точки (.) выбирает все символы, кроме новых строк. Исправим это, заменив точку на \w, который выбирает любую букву, цифру или знак нижнего подчеркивания:
import re string = "Регулярные выражения в Python" result = re.findall(r'\w', string) print(result) >>> ['Р', 'е', 'г', 'у', 'л', 'я', 'р', 'н', 'ы', 'е', 'в', 'ы', 'р', 'а', 'ж', 'е', 'н', 'и', 'я', 'в', 'P', 'y', 't', 'h', 'o', 'n']
Мы избавились от пробелов и теперь попробуем объединить буквы в слова с помощью символа +:
import re string = "Регулярные выражения в Python" result = re.findall(r'\w+', string) print(result) >>> ['Регулярные', 'выражения', 'в', 'Python']
Теперь осталось выбрать только первое слово с помощью символа ^:
import re string = "Регулярные выражения в Python" result = re.findall(r'^\w+', string) print(result) >>> ['Регулярные']
Задача 2
Вернуть последнее слово из строки «Регулярные выражения в Python».
Эта задача тесно связана с прошлой. Мы уже научились получать каждое слово из фразы и возвращать только первое. Для того чтобы вернуть последнее слово, следует заменить символ ^ в начале регулярного выражения на $ в конце:
import re string = "Регулярные выражения в Python" result = re.findall(r'\w+$', string) print(result) >>> ['Python']
Задача 3
Проверить формат телефонного номера. Номер должен состоять из 11 знаков и начинаться с 7 или 8. На вход подается список телефонных номеров. Если номер корректный, то следует вернуть Correct, иначе — Incorrect.
Сперва составим регулярное выражение. В самом начале должна идти цифра 7 или 8. Запишем это в виде [78]. После этого следуют 10 любых цифр от 0 до 9 — [0-9]. Если записать это все вместе, то получится [78][0-9].
Теперь воспользуемся условием if. Если запись номера телефона будет соответствовать шаблону и содержать в себе 11 символов, то будем печатать Correct, иначе — Incorrect. По всему списку номеров пройдемся с помощью цикла for:
import re phone_numbers = ['89154167654', '38764356622', '79853452190', '891678645432', '8916657b589'] for number in phone_numbers: if re.match(r'[78][0-9]', number) and len(number) == 11: print('Correct') else: print('Incorrect') >>> Correct >>> Incorrect >>> Correct >>> Incorrect >>> Incorrect
Задача 4
В офисе сотрудники могут забронировать себе любое рабочее место на целый день. В системе это записывается в виде строки в формате Фамилия_сотрудника Номер_рабочего_места Дата. Номер рабочего места всегда представляет собой трехзначное число, а дата записывается в формате ДД-ММ-ГГГГ. Необходимо написать регулярное выражение, которое вернет даты бронирования рабочих мест.
Для решения задачи надо сперва извлечь все числа из списка. Сделать это можно с помощью \d:
import re booking = 'Иванов 023 14-08-2023, Петров 114 15-08-2023, Семенов 001 20-08-2023, Кутузов 001 01-09-2023' result = re.findall(r'\d', booking) print(result) >>> ['0', '2', '3', '1', '4', '0', '8', '2', '0', '2', '3'. ]
На выходе мы получили абсолютно все цифры из списка, но мы знаем точный паттерн, по которому задается дата, — ДД-ММ-ГГГГ. Сперва идут двузначное число дня, потом двузначное число месяца и в самом конце четырехзначное число года. В качестве разделителей используется дефис. Все это можно описать в виде следующего регулярного выражения:
import re booking = 'Иванов 023 14-08-2023, Петров 114 15-08-2023, Семенов 001 20-08-2023, Кутузов 001 01-09-2023' result = re.findall(r'\d-\d-\d', booking) print(result) >>> ['14-08-2023', '15-08-2023', '20-08-2023', '01-09-2023']
Задача 5
В России для регистрации машин используют принятый стандарт регистрационных знаков. Для частных автомобилей он состоит из серии, самого номера и кода региона регистрации. Запись автомобильного номера выглядит так: С065МК777. На вход программы подается список автомобильных номеров. Надо проверить соответствие их записи с государственным стандартом.
| Ввод | Вывод |
|---|---|
| В443РХ777 АА545Р750 Е454АЕ150 М709РО96 В45РАВ77 У822НО02 |
✅ — В443РХ777 ❌ — АА545Р750 ✅ — Е454АЕ150 ✅ — М709РО96 ❌ — В45РАВ77 ✅ — У822НО02 |
Для записи серии номера используются заглавные буквы русского алфавита, у которых есть аналоги в латинице — А, В, Е, К, М, Н, О, Р, С, Т, У и Х. Номер региона записывается двумя или тремя цифрами. Будем проверять наличие последовательности из одной буквы, трех цифр, двух букв и от двух до трех цифр.
По всему списку пройдемся с помощью цикла for, а проверять соответствие и печатать результат будем с помощью условия if:
import re numbers = 'В443РХ777', 'АА545Р750', 'Е454АЕ150', 'М709РО96', 'В45РАВ77', 'У822НО02' for number in numbers: if re.findall(r'[АВЕКМНОРСТУХ]\d[АВЕКМНОРСТУХ]\d', number): print('✅ — ' + number) else: print('❌ — ' + number) .
Где практиковаться с регулярными выражениями
Для освоения регулярных выражений нужно много практики. Это поможет запомнить синтаксис и без проблем писать сложные выражения. Для практики можно решать задачи в специальных сервисах:
- Regex Learn — интерактивный курс по регулярным выражениям. Авторы предлагают пошагово изучить тему с нуля. На платформе есть базовый курс из 56 уроков и еще один — по применению регулярных выражений в SEO из 17 уроков из 9 видеороликов. Оба курса бесплатные, но доступны только на английском языке.

- Regex One — еще один пошаговый курс, освещающий все аспекты работы с регулярными выражениями. Во время прохождения придется решать много задач и составлять сложные «регулярки».

- Codewars — на платформе собраны задачи по языкам программирования, но среди них встречаются и регулярные выражения. Можно отфильтровать коллекцию задач по темам, чтобы решать только нужные.

Во время решения задач не всегда удобно запускать полноценную среду разработки для проверки выражения. Для этого есть онлайн-редакторы RegEx, с помощью которых можно вводить «регулярки» в окне браузера. Также на таких платформах есть визуализация работы шаблонов, что может наглядно показать выборку символов. Эта функция особенно полезна на начальных этапах освоения «регулярок».
Список популярных онлайн-редакторов регулярных выражений:
Итог
- Регулярные выражения в Python — мощный инструмент для работы с текстом и строками.
- С помощью регулярных выражений можно проверять валидность адресов, парсить документы и искать данные в тексте.
- Шаблоны позволяют тонко настроить поиск по фрагментам текста.
- В теме регулярных выражений мало теории, и успех освоения технологии зависит от большого количества практики.
- Регулярные выражения поддерживаются практически во всех языках программирования, поэтому, освоив их в Python, можно применять и в других популярных языках.
- Для закрепления материала важно последовательное изучение. Не стоит после решения задач по поиску дат в тексте переходить к парсингу HTML-файлов.
Python-разработчик
Освойте Python с нуля. Подготовим к трудоустройству: дадим много практики, реальные проекты для портфолио, поможем с резюме. Лучшие студенты пройдут стажировки в проектах компаний-партнеров.
Как создать регулярное выражение python

Этот код вернет None , несмотря на то, что в строке есть 5 фрагментов «ку». Это происходит потому, что оба фрагмента расположены не в начале строки.
re.search() – находит первое вхождение фрагмента в любом месте и возвращает объект match. Если в строке есть другие фрагменты, соответствующие запросу, re.search их проигнорирует. У re.search есть дополнительные методы:
.span() – возвращает кортеж, содержащий начальную и конечную позиции искомого фрагмента.
.string – вернет строку, переданную в функцию re.search.
.group() – возвращает фрагмент строки, в котором было обнаружено совпадение.
#Содержимое файла после выполнения кода: 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-селекторов окажется более эффективным.
Материалы по теме
- Регулярные выражения: 5 сервисов для тестирования и отладки
- Практическое введение в регулярные выражения для новичков
- Регулярные выражения: базовое знакомство для новичков
