#статьи
Исчерпывающий гайд по работе с мощным инструментом для анализа и обработки строк.
Иллюстрация: Оля Ежак для SKillbox Media
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.
Само словосочетание «регулярные выражения» звучит непонятно и выглядит страшно, но на самом деле ничего сложного в работе с ними нет. В этой статье мы познакомим вас с их логикой и основными принципами и научим разговаривать на языке шаблонов. В хорошем смысле слова.
Содержание:
Представьте, что вы снова в школе, на уроке истории. Вам нужно решить итоговую контрольную работу по всем датам, которые проходили в четверти.
Но тут вас поджидает препятствие: все даты разбросаны по нескольким главам учебника по десятку страниц каждая. Читать полкниги в поисках нужных вам крупиц информации — такое себе удовольствие. Тем более когда каждая минута на счету.
К счастью, вы — человек неглупый (не зря же пошли в IT), тренированный и быстро соображающий. Поэтому моментально замечаете основные закономерности:
- даты обозначаются цифрами: арабскими, если это год и месяц, и римскими, если век;
- учебник — по истории позднего Средневековья и Нового времени, поэтому все даты, написанные арабскими цифрами, — четырёхсимвольные;
- после римских цифр всегда идёт слово «век».
Теперь у вас есть шаблон нужной информации. Остаётся лишь пролистать страницу за страницей и записать даты в смартфон (или себе на подкорку). Вуаля: пятёрка за четверть у вас в дневнике, а премия от родителей за отличную учёбу — в кармане.
По такому же принципу работают и регулярные выражения: они ведут поиск фрагментов текста по определённому шаблону. Если фрагмент совпадает с шаблоном — с ним можно работать.
Запишем логику поиска исторических дат в виде регулярных выражений (они ещё называются Regular Expressions, сокращённо regex или regexp). Выглядеть он будет так:
(?:\d{4})|(?:[IVX]+ век)
Приятные новости: regex — настолько полезный и мощный инструмент, что поддерживается почти всеми современными языками программирования, в том числе и Python. Причём соответствующий синтаксис в разных языках очень схож. Так что, выучив его в одном языке, можно пользоваться им в других, практически не переучиваясь. Поехали.
С помощью regex можно искать как вполне конкретные выражения (например, слово «век» — последовательность букв «в», «е» и «к»), так и что-то более общее (например, любую букву или цифру).
Для обозначения второй категории существуют специальные символы. Вот некоторые из них:
СимволЧто означает
Пример использования шаблонаПример вывода.Любой символ, кроме новой строки (\n)H.llo, .orld
20.. год
Hello, world; Hallo, 2orld
2022 год, 2010 год
[…]Любой символ из указанных в скобках. Символы можно задавать как перечислением, так и указывая диапазон через дефис[abc123]
[A-Z]
[A-Za-z0-9]
[А-ЯЁа-яё]
а; 1
B; T
A; s; 1
А; ё
[^…]Любой символ, кроме указанных в скобках[^A-Za-z]з, 4^Начало строки^Добрый день,0$Конец строкиДо свидания!$0|Логическое ИЛИ. Регулярное выражение будет искать один из нескольких вариантов[0-9]|[IVXLCDM] — регулярное выражение будет находить совпадение, если цифра является либо арабской, либо римской5; V\Экранирование. Помогает регулярным выражениям ориентироваться, является ли следующий за \ символ обычным или специальным\A\d\w\Z — экранирование превращает буквы алфавита в спецсимволы.
\[\.\] — экранирование превращает спецсимволы в обычные
0
Важное замечание 1. Регулярные выражения зависимы от регистра, то есть «А» и «а» при поиске будут считаться разными символами.
Важное замечание 2. Буквы «Ё» и «ё» не входят в диапазон «А — Я» и «а — я». Так что, задавая русский алфавит, их нужно выписывать отдельно.
На экранировании остановимся подробнее. По умолчанию символы .^$*+? {}[]\|() являются спецсимволами — то есть они выполняют определённые функции. Чтобы сделать спецсимволы обычными, их нужно экранировать \.
Таким образом, . будет обозначать любой символ, а \. — знак точки. Чтобы написать обратный слеш, его тоже нужно экранировать, то есть в регулярных выражениях он будет выглядеть так: \\.
Обратная ситуация с некоторыми алфавитными символами. По умолчанию они считаются просто буквами, но при экранировании начинают играть роль спецсимволов.
СимволЧто означает\dЛюбая цифра. То же самое, что [0-9]\DЛюбой символ, кроме цифры. То же самое, что [^0-9]\wЛюбая буква, цифра и нижнее подчёркивание\WЛюбой символ, кроме буквы, цифры и нижнего подчёркивания\sЛюбой пробельный символ (пробел, новая строка, табуляция, возврат каретки и тому подобное)\SЛюбой символ, кроме пробельного\AНачало строки. То же самое, что ^\ZКонец строки. То же самое, что $\bНачало или конец слова\BСередина слова\n, \t\, \rСтандартные строковые обозначения: новая строка, табуляция, возврат каретки
Важное замечание. \A, \Z, \b и \B указывают не на конкретный символ, а на положение других символов относительно друг друга. Можно сказать, что они указывают на пространство между символами.
Например, регулярное выражение \b[А-ЯЁаяё]\b будет искать только те буквы, которые отделены друг от друга пробелами или знаками препинания.
Часто при записи регулярного выражения какая-то часть шаблона должна повторяться определённое количество раз. Число вхождений в синтаксисе regex задают с помощью квантификаторов. Они всегда помещаются после той части шаблона, которую нужно повторить.
СимволЧто означает
Примеры шаблонаПримеры вывода{}Указывает количество вхождений, можно задавать единичным числом или диапазоном\d{4} — цифра, четыре подряд
\d{1,4} — цифра, от одного до четырёх раз подряд
\d{2,} — цифра, от двух раз подряд
\d{,4} — цифра, от 0 до 4 раз подряд
1243, 1876
1, 12, 176, 1589
22, 456, 988888
5, 15, 987, 1234
?От нуля до одного вхождения. То же самое, что {0,1}\d?0*От нуля вхождений. То же самое, что {0,}\d*0+От одного вхождения. То же самое, что {1,}\d+0
Теперь давайте ещё раз посмотрим на наше регулярное выражение для поиска дат по учебнику истории:
(?:\d{4})|(?:[IVX]+ век)
В нём есть несколько дополнительных символов, о которых рассказано ниже, но начинка этого выражения уже понятна.
- \d{4} — цифра, четыре подряд
- | — логическое ИЛИ
- [IVX]+ век — символ I, V или X, одно или более вхождений, пробел, слово «век»
Попрактиковаться в составлении регулярных выражений можно на сайте regex101.com. А мы разберём основные приёмы их использования и решим несколько задач.
Уточним ещё несколько терминов regex.
Регулярные выражения — это инструмент для работы со строками, которые и являются основной их единицей.
Строка представляет собой как само регулярное выражение, так и текст, по которому ведётся поиск.
Найденные в тексте совпадения с шаблоном называются подстроками. Например, у нас есть регулярное выражение м. (буква «м», затем любой символ) и текст «Мама мыла раму». Применяя регулярное выражение к тексту, мы найдём подстроки «ма», «мы» и «му». Подстроку «Ма» наше выражение пропустит из-за разницы в регистре.
Есть и более мелкая единица, чем подстрока, — группа. Она представляет собой часть подстроки, которую мы попросили выделить специально. Группы выделяются круглыми скобками (…).
Возьмём ту же строку «Мама мыла раму» и применим к ней следующее регулярное выражение:
(\w)(\w{3})
Оно значит: буквенный символ, выделенный группой, и за ним ещё три буквенных символа, также выделенных группой. Итого весь шаблон представляет собой четыре буквенных символа.
В нашем тексте это выражение найдёт три совпадения, в каждом из которых выделит две группы:
ПодстрокаГруппа 1Группа 2МамаМамамыламыларамураму
Это помогает извлечь из найденной подстроки конкретную информацию, отбросив всё остальное. Например, мы нашли адрес, состоящий из названия улицы, номера дома и номера квартиры. Подстрока будет представлять собой адрес целиком, а в группы можно поместить отдельно каждый его структурный элемент — и потом обращаться к нему напрямую.
Группам можно давать имена с помощью такой формы: (? P<name>…)
Вот так будет выглядеть наш шаблон, ищущий четырёхбуквенные слова, если мы дадим имена группам:
?P<first_letter>\w)(?P<rest_letters>\w{3})
Уберём группы и упростим регулярное выражение, чтобы оно искало только подстроку:
\w{4}
Немного изменим текст, по которому ищем совпадения: «Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке».
Регулярное выражение ищет четыре буквенных символа подряд, поэтому в качестве отдельных подстрок находит также «пило», «раме», «рабо», «тает», «лесо» и «пилк».
Исправьте регулярное выражение так, чтобы оно находило только четырёхбуквенные слова. То есть оно должно найти подстроки «мама», «мыла», «раму» и «папа» — и ничего больше.
Подсказка, если не можете решить задачу
Используйте символ \b.
Важное замечание. При написании regex нужно помнить, что они ищут только непересекающиеся подстроки. Под шаблон \w{4} в слове «работает» подходят не только подстроки «рабо» и «тает», но и «абот», «бота», «отае». Их регулярное выражение не находит, потому что тогда бы эти подстроки пересеклись с другими — а в regex так нельзя.
Нередко при использовании регулярных выражений требуется применить квантификатор либо логическое ИЛИ не к отдельному символу, а к целой группе. Именно так мы поступили в нашем шаблоне для поиска дат по учебнику истории:
(?:\d{4})|(?:[IVX]+ век)
С помощью скобок мы сказали: выдайте совпадение, если в тексте присутствует хотя бы один из двух вариантов — либо год, либо век.
Важное замечание.? : в начале группы означает, что мы просим regex не запоминать эту группу. Если все группы открываются символами? :, то регулярные выражения вернут только подстроку и ни одной группы.
В Python это может быть полезно, потому что некоторые re-функции возвращают разные результаты в зависимости от того, запомнили ли регулярные выражения какие-то группы или нет.
Также к группам удобно применять квантификаторы. Например, имена многих дроидов в «Звёздных войнах» построены по принципу: буква — цифра — буква — цифра.
Вот так это выглядит без групп:
[A-Z]\d[A-Z]\d
И вот так с ними:
(?:[A-Z]\d){2}
Особенно полезно использовать незапоминаемые группы со сложными шаблонами.
Чтобы работать с регулярными выражениями в Python, необходимо импортировать модуль re:
import re
Это даёт доступ к нескольким функциям. Вот их краткое описание.
ФункцияЧто делает
Если находит совпадениеЕсли не находит совпадениеre.match (pattern, string)Ищет pattern в начале строки stringВозвращает Match-объектВозвращает Nonere.search (pattern, string)Ищет pattern по всей строке stringВозвращает Match-объект с первым совпадением, остальные не находитВозвращает Nonere.finditer (pattern, string)Ищет pattern по всей строке stringВозвращает итератор, содержащий Match-объекты для каждого найденного совпаденияВозвращает пустой итераторre.findall (pattern, string)Ищет pattern по всей строке stringВозвращает список со всеми найденными совпадениямиВозвращает Nonere.split (pattern, string, [maxsplit=0])Разделяет строку string по подстрокам, соответствующим patternВозвращает список строк, на которые разделила исходную строкуВозвращает список строк, единственный элемент которого — неразделённая исходная строкаre.sub (pattern, repl, string)Заменяет в строке string все pattern на replВозвращает строку в изменённом видеВозвращает строку в исходном видеre.compile (pattern)Собирает регулярное выражение в объект для будущего использования в других re-функцияхНичего не ищет, всегда возвращает Pattern-объект0
Важное замечание. Напоминаем, что регулярные выражения по умолчанию ищут только непересекающиеся подстроки.
Для написания регулярных выражений в Python используют r-строки (их называют сырыми, или необработанными). Это связано с тем, что написание знака \ требует экранирования не только в регулярных выражениях, но и в самом Python тоже.
Чтобы программистам не приходилось экранировать экранирование и писать нагромождения обратных слешей, и придумали r-строки. Синтаксически они обозначаются так:
r'...'
Перечислим самые популярные из них.
Находит совпадение только в том случае, если соответствующая шаблону подстрока находится в начале строки, по которой ведётся поиск:
print (re.match (r'Мама', 'Мама мыла раму'))
>>> <re.Match object; span=(0, 4), match='Мама'>
print (re.match (r'мыла', 'Мама мыла раму'))
>>> None
Как видим, поиск по шаблону «Мама» нашёл совпадение и вернул Match-объект. Слово же «мыла», хотя и есть в строке, находится не в начале. Поэтому регулярное выражение ничего не находит и возвращается None.
Ищет совпадения по всему тексту:
print (re.search (r'Мама', 'Мама мыла раму'))
>>> <re.Match object; span=(0, 4), match='Мама'>
print (re.search (r'мыла', 'Мама мыла раму'))
>>> <re.Match object; span=(5, 9), match='мыла'>
При этом re.search возвращает только первое совпадение, даже если в строке, по которой ведётся поиск, их больше. Проверим это:
print (re.search (r'мыла', 'Мама мыла раму, а потом ещё раз мыла, потому что не домыла'))
>>> <re.Match object; span=(5, 9), match='мыла'>
Возвращает итератор с объектами, к которым можно обратиться через цикл:
results = re.finditer (r'мыла', 'Мама мыла раму, а потом ещё раз мыла, потому что не домыла')
print (results)
>>> <callable_iterator object at 0x000001C4CDE446D0>
for match in results:
print (match)
>>> <re.Match object; span=(5, 9), match='мыла'>
>>> <re.Match object; span=(32, 36), match='мыла'>
>>> <re.Match object; span=(54, 58), match='мыла'>
Эта функция очень полезна, если вы хотите получить Match-объект для каждого совпадения.
В Match-объектах хранится много всего интересного. Посмотрим внимательнее на объект с подстрокой «Мама», который нашла функция re.match:
<re.Match object; span=(0, 4), match='Мама'>
span — это индекс начала и конца найденной подстроки в тексте, по которому мы искали совпадение. Обратите внимание, что второй индекс не включается в подстроку.
match — это собственно найденная подстрока. Если подстрока длинная, то она будет отображаться не целиком.
Это, конечно же, не всё, что можно получить от Match-объекта. Рассмотрим ещё несколько методов.
Возвращает найденную подстроку, если ему не передавать аргумент или передать аргумент 0. То же самое делает обращение к объекту по индексу 0:
match = re.match (r'Мама', 'Мама мыла раму')
print (match.group())
>>> Мама
print (match.group(0))
>>> Мама
print (match[0])
>>> Мама
Если регулярное выражение поделено на группы, то, начиная с единицы, можно вызвать группу отдельно от строки:
match = re.match (r'(М)(ама)', 'Мама мыла раму')
print (match.group(1))
print (match.group(2))
>>> М
>>> ама
print (match[1])
print (match[2])
>>> М
>>> ама
#Методом group также можно получить кортеж из нужных групп.
print (match.group(1,2))
>>> ('М', 'ама')
Если группы поименованы, то в качестве аргумента метода group можно передавать их название:
match = re.match (r'(?P<first_letter>М)(?P<rest_letters>ама)', 'Мама мыла раму')
print (match.group('first_letter'))
print (match.group('rest_letters'))
>>> М
>>> ама
Если одна и та же группа соответствует шаблону несколько раз, то в группу запишется только последнее совпадение:
#Помещаем в группу один буквенный символ, при этом шаблон представляет собой четыре таких символа.
match = re.match (r'(\w){4}', 'Мама мыла раму')
print (match.group(0))
>>> Мама
print (match.group(1))
>>> а
Возвращает кортеж с группами:
match = re.match (r'(М)(ама)', 'Мама мыла раму')
print (match.groups())
>>> ('М', 'ама')
Возвращает кортеж с индексом начала и конца подстроки в исходном тексте. Если мы хотим получить только первый индекс, можно использовать метод start, только последний — end:
match = re.search (r'мыла', 'Мама мыла раму')
print (match.span())
>>> (5, 9)
print (match.start())
>>> 5
print (match.end())
>>> 9
Возвращает просто список совпадений. Никаких Match-объектов, к которым нужно дополнительно обращаться:
#В этом примере в качестве регулярного выражения мы используем правильный ответ на задание 0.
match_list = re.findall (r'\b\w{4}\b', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (match_list)
>>> ['Мама', 'мыла', 'раму', 'папа']
Функция ведёт себя по-другому, если в регулярном выражении есть деление на группы. Тогда функция возвращает список кортежей с группами:
match_list = re.findall (r'\b(\w{1})(\w{3})\b', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (match_list)
>>> [('М', 'ама'), ('м', 'ыла'), ('р', 'аму'), ('п', 'апа')]
Аналог метода str.split. Делит исходную строку по шаблону, а сам шаблон исключает из результата:
#Поделим строку по запятой и пробелу после неё.
split_string = re.split (r', ', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (split_string)
>>> ['Мама мыла раму', 'а папа был на пилораме', 'потому что работает на лесопилке.']
re.split также имеет дополнительный аргумент maxsplit — это максимальное количество частей, на которые функция может поделить строку. По умолчанию maxsplit равен нулю, то есть не устанавливает никаких ограничений:
#Приравняем аргумент maxsplit к единице.
split_string = re.split (r', ', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.', maxsplit=1)
print (split_string)
>>> ['Мама мыла раму', 'а папа был на пилораме, потому что работает на лесопилке.']
Если в re.split мы указываем группы, то они попадают в список строк в качестве отдельных элементов. Для наглядности поделим исходную строку на слог «па»:
#Помещаем буквы «п» и «а» в одну группу.
split_string = re.split (r'(па)', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (split_string)
>>> ['Мама мыла раму, а ', 'па', '', 'па', ' был на пилораме, потому что работает на лесопилке.']
#Помещаем буквы «п» и «а» в разные группы.
split_string = re.split (r'(п)(а)', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (split_string)
>>> ['Мама мыла раму, а ', 'п', 'а', '', 'п', 'а', ' был на пилораме, потому что работает на лесопилке.']
Требует указания дополнительного аргумента в виде строки, на которую и будет заменять найденные совпадения:
new_string = re.sub (r'Мама', 'Дочка', 'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.')
print (new_string)
>>> Дочка мыла раму, а папа был на пилораме, потому что работает на лесопилке.
Дополнительные возможности у функции появляются при применении групп. В качестве аргумента замены ему можно передать не строку, а ссылку на номер группы в виде \n. Тогда он подставит на нужное место соответствующую группу из шаблона. Это очень удобно, когда нужно поменять местами структурные элементы в тексте:
new_string = re.sub (r'(\w+) (\w+) (\w+),', r'\2 \3 \1 –', 'Бендер Остап Ибрагимович, директор ООО "Рога и копыта"')
print (new_string)
>>> Остап Ибрагимович Бендер — директор ООО "Рога и копыта"
Используется для ускорения и упрощения кода, когда одно и то же регулярное выражение применяется в нём несколько раз. Её синтаксис выглядит так:
pattern = re.compile (r'Мама')
print (pattern.search ('Мама мыла раму'))
>>> <re.Match object; span=(0, 4), match='Мама'>
print (pattern.sub ('Дочка', 'Мама мыла раму'))
>>> Дочка мыла раму
Нередко в регулярных выражениях нужно учесть сразу много вариантов и опций, из-за чего их структура усложняется. А regex даже простые и короткие читать нелегко, что уж говорить о длинных.
Чтобы хоть как-то облегчить чтение регулярок, в Python r-строки можно делить точно так же, как и обычные. Возьмём наше выражение для поиска дат по учебнику истории:
re.findall (r'(?:\d{4})|(?:[IVX]+ век)', text)
Его же можно написать вот в таком виде:
re.findall (r'(?:\d{4})'
r'|'
r'(?:[IVX]+ век)', text)
Часто при написании регулярных выражений приходится использовать квантификаторы, охватывающие диапазон значений. Например, \d{1,4}. Как регулярные выражения решают, сколько цифр им захватить, одну или четыре? Это определяется пропуском квантификаторов.
По умолчанию все квантификаторы являются жадными, то есть стараются захватить столько подходящих под шаблон символов, сколько смогут.
В некоторых случаях это может стать проблемой. Например, возьмём часть оглавления поэмы Венедикта Ерофеева «Москва — Петушки», записанную в одну строку:
Фрязево — 61-й километр..........64 61-й километр — 65-й километр…68 65-й километр — Павлово-Посад…71 Павлово-Посад — Назарьево........73 Назарьево — Дрезна...............77 Дрезна — 85-й километр...........80
Нужно написать регулярное выражение, которое выделит каждый пункт оглавления. Для этого определим признаки, по которым мы будем это делать:
- Каждый пункт начинается с буквы или цифры (для этого используем шаблон \w).
- Он может содержать внутри себя любой набор символов: буквы, цифры, знаки препинания (для этого используем шаблон .+).
- Он заканчивается на точку, после которой следует от одной до трёх цифр (для этого используем шаблон \.\d{1,3}).
Посмотрим в конструкторе, как работает наше выражение:
Скриншот: Skillbox MediaЧто же произошло? Почему найдено только одно совпадение, причем за него посчитали весь текст сразу? Всё дело в жадности квантификатора +, который старается захватить максимально возможное количество подходящих символов.
В итоге шаблон \w находит совпадение с буквой «Ф» в начале текста, шаблон \.\d{1,3} находит совпадение с «.80» в конце текста, а всё, что между ними, покрывается шаблоном .+.
Чтобы квантификатор захватывал минимально возможное количество символов, его нужно сделать ленивым. В таком случае каждый раз, находя совпадение с шаблоном ., регулярное выражение будет спрашивать: «Подходят ли следующие символы в строке под оставшуюся часть шаблона?»
Если нет, то функция будет искать следующее совпадение с .. А если да, то . закончит свою работу и следующие символы строки будут сравниваться со следующей частью регулярного выражения: \.\d{1,3}.
Чтобы объявить квантификатор ленивым, после него надо поставить символ ?. Сделаем ленивым квантификатор + в нашем регулярном выражении для поиска строк в оглавлении:
Скриншот: Skillbox MediaТеперь, когда мы уверены в правильности работы нашего регулярного выражения, используем функцию re.findall, чтобы выписать оглавление построчно:
content = 'Фрязево — 61-й километр..........64 61-й километр — 65-й километр....68 65-й километр — Павлово-Посад....71 Павлово-Посад — Назарьево........73 Назарьево — Дрезна...............77 Дрезна — 85-й километр...........80'
strings = re.findall (r'\w.+?\.\d{1,3}', content)
for string in strings:
print (string)
#Результат на экране.
>>> Фрязево — 61-й километр..........64
>>> 61-й километр — 65-й километр....68
>>> 65-й километр — Павлово-Посад....71
>>> Павлово-Посад — Назарьево........73
>>> Назарьево — Дрезна...............77
>>> Дрезна — 85-й километр...........80
В некоторых случаях одну и ту же задачу можно решить разными способами, используя разные возможности регулярок. Попробуйте решить следующие задачи самостоятельно. Возможно, у вас даже получится сделать это более эффективно.
При обнародовании судебных решений из них извлекают персональные данные участников процесса — фамилии, имена и отчества. Каждое слово в Ф. И. О. начинается с заглавной буквы, при этом фамилия может быть двойная.
Напишите программу, которая заменит в тексте Ф. И. О. подсудимого на N.
Подсудимая Эверт-Колокольцева Елизавета Александровна в судебном заседании вину инкриминируемого правонарушения признала в полном объёме и суду показала, что 14 сентября 1876 года, будучи в состоянии алкогольного опьянения от безысходности, в связи с состоянием здоровья позвонила со своего стационарного телефона в полицию, сообщив о том, что у неё в квартире якобы заложена бомба. После чего приехали сотрудники полиции, скорая и пожарные, которым она сообщила, что бомба — это она.
«Подсудимая N в судебном заседании» и далее по тексту.
Подсказка
Используйте незапоминаемую опциональную группу вида (? : …)? , чтобы обозначить вторую часть фамилии после дефиса.
Решение
#Сначала кладём в переменную string текст строки, по которой ведём поиск.
print (re.sub (r'[А-ЯЁ]\w*'
r'(?:-[А-ЯЁ]\w*)?'
r'(?: [А-ЯЁ]\w*){2}', 'N', string))
Большинство адресов состоит из трёх частей: название улицы, номер дома и номер квартиры. Название улицы может состоять из нескольких слов, каждое из которых пишется с заглавной буквы. Номер дома может содержать после себя букву.
Перед названием улицы может быть написано «Улица», «улица», «Ул.» или «ул.», перед номером дома — «дом» или «д.», перед номером квартиры — «квартира» или «кв.». Также номер дома и номер квартиры могут быть разделены дефисом без пробелов.
Дан текст, в нём нужно найти все адреса и вывести их в виде «Пушкина 32-135».
Для упрощения мы не будем учитывать дома, которые находятся не на улицах, а на площадях, набережных, бульварах и так далее.
Добрый день!
Сегодня на выезды потребуется отправить трёх-четырёх специалистов, остальных держите в офисе. Некоторые заявки пришли на конкретных людей, но можно вызвать и других, смотрите по ситуации, как лучше их отправить, чтобы всех объездить сегодня.
Петрову П. П. попросили выехать по адресам ул. Культуры 78 кв. 6, улица Мира дом 12Б квартира 144. Смирнова С. С. просят подъехать только по адресу: Восьмого Марта 106-19. Без предпочтений по специалистам пришли запросы с адресов: улица Свободы 54 6, Улица Шишкина дом 9 кв. 15, ул. Лермонтова 18 кв. 93.
Все адреса скопированы из заявок, корректность подтверждена.
Культуры 78-6
Мира 12Б-144
Восьмого Марта 106-19
Свободы 54-6
Шишкина 9-15
Лермонтова 18-93
Подсказка
Используйте деление на группы, чтобы удобно выстроить структуру выражения. Попросите regex запоминать только нужные вам части адреса, чтобы функция не возвращала вам лишние подгруппы.
Решение
#Сначала кладём в переменную string текст строки, по которой ведём поиск.
pattern = re.compile (r'(?:[Уу]л(?:\.|ица) )?'
r'((?:[А-ЯЁ]\w+)(?: [А-ЯЁ]\w+)*)'
r' (?:дом |д\. )?'
r'(\d+\w?)'
r'[ -](?:квартира |кв\. )?'
r'(\d+)')
addresses = pattern.findall (text)
for address in addresses:
print (f'{address[0]} {address[1]}-{address[2]}')
Структура этого регулярного выражения довольно сложная. Чтобы в нём разобраться, посмотрите на схему. Прямоугольники обозначают обязательные элементы, овалы — опциональные. Развилки символизируют разные варианты, которые допускает наш шаблон. Красным цветом очерчены группы, которые мы запоминаем.
Инфографика: Майя Мальгина для Skillbox MediaПисатели в поиске собственного неповторимого стиля нередко изобретают оригинальные творческие приёмы и неукоснительно им следуют. Например, Сергей Довлатов следил за тем, чтобы слова в предложении не начинались с одной и той же буквы.
Даны несколько предложений. Программа должна проверить, встречаются ли в каждом из них слова на одинаковую букву. Если таких нет, она печатает: «Метод Довлатова соблюдён». А если есть: «Вы расстроили Сергея Донатовича».
Важно. Чтобы регулярные выражения не рассматривали заглавные и прописные буквы как разные символы, передайте re-функции дополнительный аргумент flags=re.I или flags=re.IGNORECASE.
Здесь все слова начинаются с разных букв.
А в этом предложении есть слова, которые всё-таки начинаются на одну и ту же букву.
А здесь совсем интересно: символ «а» однобуквенный.
Метод Довлатова соблюдён
Вы расстроили Сергея Донатовича
Вы расстроили Сергея Донатовича
Подсказка
Чтобы указать на начало слова, используйте символ \b.
Чтобы в каждом совпадении regex не старалось захватить максимум, используйте ленивый пропуск.
Чтобы найти повторяющийся символ, используйте ссылку на группу в виде \1.
Решение
#Сначала кладём в переменную string текст строки, по которой ведём поиск.
pattern = r'\b(\w)\w*.*?\b\1'
match = re.search (pattern, string, flags=re.I)
if match is None:
print ('Метод Довлатова соблюдён')
else:
print ('Вы расстроили Сергея Донатовича')
Вернёмся к регулярному выражению, которое ищет даты в учебнике истории: (? :\d{4})|(? : [IVX]+ век).
Оно в целом справляется со своей задачей, но также находит много ненужных чисел. Например, количество человек, которые участвовали в битве, тоже может быть описано четырьмя цифрами подряд.
Чтобы не получать лишние результаты, обратим внимание на то, как именно могут быть записаны годы. Есть несколько вариантов записи: 1400 год, 1400 г., 1400–1500 годы, 1400–1500 гг., (1400), (1400–1500).
Чтобы немного упростить задачу и не раздувать регулярное выражение, мы не будем искать конструкции «с такого-то по такой-то год» и «между таким-то и таким-то годом».
Важное замечание. Не забывайте про экранирование, если хотите использовать точки и скобки в качестве обычных, а не специальных символов. Так программа правильно поймёт, что вы имеете в виду.
Началом Реформации принято считать 31 октября 1517 г. — день, когда Мартин Лютер (1483–1546) прибил к дверям виттенбергской Замковой церкви свои «95 тезисов», в которых выступил против злоупотреблений Католической церкви. Реформация охватила практически всю Европу и продолжалась в течение всего XVI века и первой половины XVII века. Одно из самых известных и кровавых событий Реформации — Варфоломеевская ночь во Франции, произошедшая в ночь на 24 августа 1572 года.
Точное число жертв так и не удалось установить достоверно. Погибли по меньшей мере 2000 гугенотов в Париже и 3000 — в провинциях. Герцог де Сюлли, сам едва избежавший смерти во время резни, говорил о 70 000 жертв. Для Парижа единственным точным числом остаётся 1100 погибших во время Варфоломеевской ночи.
Этому событию предшествовали три других, произошедшие в 1570–1572 годах: Сен-Жерменский мирный договор (1570), свадьба гугенота Генриха Наваррского и Маргариты Валуа (1572) и неудавшееся покушение на убийство адмирала Колиньи (1572).
['1517 г.', '(1483–1546)', 'XVI век', 'XVII век', '1572 год', '1570–1572 годах', '(1570)', '(1572)', '(1572)']
Решение
#Сначала кладём в переменную string текст строки, по которой ведём поиск.
pattern = re.compile (r'(?:\(\d{4}(?:-\d{4})?\))'
r'|'
r'(?:'
r'(?:\d{4}-)?\d{4} '
r'(?:'
r'(?:год(?:ы|ах|ов)?)'
r'|'
r'(?:гг?\.)'
r')'
r')'
r'|'
r'(?:[IVX]+ век)')
print (pattern.findall (string))
Если вам сложно разобраться в структуре этого выражения, то вот его схема:
Инфографика: Майя Мальгина для Skillbox Media
Python для всех
Вы освоите Python на практике и создадите проекты для портфолио — телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер — руководитель отдела разработки в «Сбере».
Пройти бесплатно
Бесплатный курс по разработке на Python ➞
Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер — руководитель отдела разработки в «Сбере».
Пройти курс
<!DOCTYPE html>
<html class="l-html" lang="ru">
<head>
<script>
mindbox = window.mindbox || function() { mindbox.queue.push(arguments); };
mindbox.queue = mindbox.queue || [];
mindbox('create', {
endpointId: 'skillbox.skillboxMediaWebsite'
});
</script>
<script src="https://api.s.mindbox.ru/scripts/v1/tracker.js" async></script>
<script>window.yaContextCb = window.yaContextCb || []</script>
<script src="https://yandex.ru/ads/system/context.js" async></script>
<!-- Google Tag Manager -->
<script async data-skip-moving="true" type="text/javascript">
/** Google Tagmanager */
;(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start':
new Date().getTime(), event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', 'GTM-NLCGQ25');
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'GTM-NLCGQ25');
</script>
<!-- End Google Tag Manager -->
<!-- Retail Rocket -->
<script type="text/javascript">
var rrPartnerId = "6048a0d097a52514f050731f";
var rrApi = {};
var rrApiOnReady = rrApiOnReady || [];
rrApi.addToBasket = rrApi.order = rrApi.categoryView = rrApi.view =
rrApi.recomMouseDown = rrApi.recomAddToCart = function() {};
(function(d) {
var ref = d.getElementsByTagName('script')[0];
var apiJs, apiJsId = 'rrApi-jssdk';
if (d.getElementById(apiJsId)) return;
apiJs = d.createElement('script');
apiJs.id = apiJsId;
apiJs.async = true;
apiJs.src = "//cdn.retailrocket.ru/content/javascript/tracking.js";
ref.parentNode.insertBefore(apiJs, ref);
}(document));
</script>
<!-- End Retail Rocket -->
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<meta http-equiv="X-UA-Compatible" content="ie=edge"/>
<meta name="google-site-verification" content="UA-kf725UpqwkHenFmDQ05SW115fL9UdD9uXiFy-ibQ"/>
<meta name="robots" content="index, follow"/>
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="canonical" href="https://skillbox.ru/media/code/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi/">
<link rel="preload" href="https://marketplace.canva.com/EAD2962NKnQ/2/0/1600w/canva-rainbow-gradient-pink-and-purple-zoom-virtual-background-_Tcjok-d9b4.jpg" as="image" />
<link rel="preload" href="https://via.placeholder.com/1170x250/92c952" as="image" />
<link rel="preload" href="https://via.placeholder.com/768x250/40E0D0" as="image" />
<link rel="preload" href="https://via.placeholder.com/375x250/ffbcee" as="image" />
<title>Регулярные выражения в Python: подробная инструкция по применению / Skillbox Media</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="Рассказываем, где и как использовать регулярные выражения в Python и как они работают, знакомимся с методами модуля re и решаем задачи." />
<link href="/bitrix/cache/css/s1/media/kernel_main/kernel_main_v1.css?177096852510536" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/ui/fonts/opensans/ui.font.opensans.css?16341171742599" type="text/css" rel="stylesheet" />
<link href="/bitrix/js/main/popup/dist/main.popup.bundle.css?163411696226345" type="text/css" rel="stylesheet" />
<link href="//cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/css/swiper.min.css" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/page_a1ad23d5ae1fea4c6ac7c690c80a4763/page_a1ad23d5ae1fea4c6ac7c690c80a4763_v1.css?1771490810746236" type="text/css" rel="stylesheet" />
<link href="/bitrix/cache/css/s1/media/template_176a7c2453ad8025fa7d27f65ba6a4b1/template_176a7c2453ad8025fa7d27f65ba6a4b1_v1.css?1771490810442835" type="text/css" data-template-style="true" rel="stylesheet" />
<script type="text/javascript">if(!window.BX)window.BX={};if(!window.BX.message)window.BX.message=function(mess){if(typeof mess==='object'){for(let i in mess) {BX.message[i]=mess[i];} return true;}};</script>
<script type="text/javascript">(window.BX||top.BX).message({'JS_CORE_LOADING':'Загрузка...','JS_CORE_NO_DATA':'- Нет данных -','JS_CORE_WINDOW_CLOSE':'Закрыть','JS_CORE_WINDOW_EXPAND':'Развернуть','JS_CORE_WINDOW_NARROW':'Свернуть в окно','JS_CORE_WINDOW_SAVE':'Сохранить','JS_CORE_WINDOW_CANCEL':'Отменить','JS_CORE_WINDOW_CONTINUE':'Продолжить','JS_CORE_H':'ч','JS_CORE_M':'м','JS_CORE_S':'с','JSADM_AI_HIDE_EXTRA':'Скрыть лишние','JSADM_AI_ALL_NOTIF':'Показать все','JSADM_AUTH_REQ':'Требуется авторизация!','JS_CORE_WINDOW_AUTH':'Войти','JS_CORE_IMAGE_FULL':'Полный размер'});</script>
<script type="text/javascript" src="/bitrix/js/main/core/core.js?1634117028565340"></script>
<script>BX.setJSList(['/bitrix/js/main/core/core_ajax.js','/bitrix/js/main/core/core_promise.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/loadext/loadext.js','/bitrix/js/main/loadext/extension.js','/bitrix/js/main/polyfill/promise/js/promise.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/includes/js/includes.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/ui/polyfill/closest/js/closest.js','/bitrix/js/main/polyfill/fill/main.polyfill.fill.js','/bitrix/js/main/polyfill/find/js/find.js','/bitrix/js/main/polyfill/matches/js/matches.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/core/core.js','/bitrix/js/main/polyfill/intersectionobserver/js/intersectionobserver.js','/bitrix/js/main/lazyload/dist/lazyload.bundle.js','/bitrix/js/main/polyfill/core/dist/polyfill.bundle.js','/bitrix/js/main/parambag/dist/parambag.bundle.js']);
BX.setCSSList(['/bitrix/js/main/lazyload/dist/lazyload.bundle.css','/bitrix/js/main/parambag/dist/parambag.bundle.css']);</script>
<script type="text/javascript">(window.BX||top.BX).message({'AMPM_MODE':false});(window.BX||top.BX).message({'MONTH_1':'Январь','MONTH_2':'Февраль','MONTH_3':'Март','MONTH_4':'Апрель','MONTH_5':'Май','MONTH_6':'Июнь','MONTH_7':'Июль','MONTH_8':'Август','MONTH_9':'Сентябрь','MONTH_10':'Октябрь','MONTH_11':'Ноябрь','MONTH_12':'Декабрь','MONTH_1_S':'января','MONTH_2_S':'февраля','MONTH_3_S':'марта','MONTH_4_S':'апреля','MONTH_5_S':'мая','MONTH_6_S':'июня','MONTH_7_S':'июля','MONTH_8_S':'августа','MONTH_9_S':'сентября','MONTH_10_S':'октября','MONTH_11_S':'ноября','MONTH_12_S':'декабря','MON_1':'янв','MON_2':'фев','MON_3':'мар','MON_4':'апр','MON_5':'май','MON_6':'июн','MON_7':'июл','MON_8':'авг','MON_9':'сен','MON_10':'окт','MON_11':'ноя','MON_12':'дек','DAY_OF_WEEK_0':'Воскресенье','DAY_OF_WEEK_1':'Понедельник','DAY_OF_WEEK_2':'Вторник','DAY_OF_WEEK_3':'Среда','DAY_OF_WEEK_4':'Четверг','DAY_OF_WEEK_5':'Пятница','DAY_OF_WEEK_6':'Суббота','DOW_0':'Вс','DOW_1':'Пн','DOW_2':'Вт','DOW_3':'Ср','DOW_4':'Чт','DOW_5':'Пт','DOW_6':'Сб','FD_SECOND_AGO_0':'#VALUE# секунд назад','FD_SECOND_AGO_1':'#VALUE# секунду назад','FD_SECOND_AGO_10_20':'#VALUE# секунд назад','FD_SECOND_AGO_MOD_1':'#VALUE# секунду назад','FD_SECOND_AGO_MOD_2_4':'#VALUE# секунды назад','FD_SECOND_AGO_MOD_OTHER':'#VALUE# секунд назад','FD_SECOND_DIFF_0':'#VALUE# секунд','FD_SECOND_DIFF_1':'#VALUE# секунда','FD_SECOND_DIFF_10_20':'#VALUE# секунд','FD_SECOND_DIFF_MOD_1':'#VALUE# секунда','FD_SECOND_DIFF_MOD_2_4':'#VALUE# секунды','FD_SECOND_DIFF_MOD_OTHER':'#VALUE# секунд','FD_SECOND_SHORT':'#VALUE#с','FD_MINUTE_AGO_0':'#VALUE# минут назад','FD_MINUTE_AGO_1':'#VALUE# минуту назад','FD_MINUTE_AGO_10_20':'#VALUE# минут назад','FD_MINUTE_AGO_MOD_1':'#VALUE# минуту назад','FD_MINUTE_AGO_MOD_2_4':'#VALUE# минуты назад','FD_MINUTE_AGO_MOD_OTHER':'#VALUE# минут назад','FD_MINUTE_DIFF_0':'#VALUE# минут','FD_MINUTE_DIFF_1':'#VALUE# минута','FD_MINUTE_DIFF_10_20':'#VALUE# минут','FD_MINUTE_DIFF_MOD_1':'#VALUE# минута','FD_MINUTE_DIFF_MOD_2_4':'#VALUE# минуты','FD_MINUTE_DIFF_MOD_OTHER':'#VALUE# минут','FD_MINUTE_0':'#VALUE# минут','FD_MINUTE_1':'#VALUE# минуту','FD_MINUTE_10_20':'#VALUE# минут','FD_MINUTE_MOD_1':'#VALUE# минуту','FD_MINUTE_MOD_2_4':'#VALUE# минуты','FD_MINUTE_MOD_OTHER':'#VALUE# минут','FD_MINUTE_SHORT':'#VALUE#мин','FD_HOUR_AGO_0':'#VALUE# часов назад','FD_HOUR_AGO_1':'#VALUE# час назад','FD_HOUR_AGO_10_20':'#VALUE# часов назад','FD_HOUR_AGO_MOD_1':'#VALUE# час назад','FD_HOUR_AGO_MOD_2_4':'#VALUE# часа назад','FD_HOUR_AGO_MOD_OTHER':'#VALUE# часов назад','FD_HOUR_DIFF_0':'#VALUE# часов','FD_HOUR_DIFF_1':'#VALUE# час','FD_HOUR_DIFF_10_20':'#VALUE# часов','FD_HOUR_DIFF_MOD_1':'#VALUE# час','FD_HOUR_DIFF_MOD_2_4':'#VALUE# часа','FD_HOUR_DIFF_MOD_OTHER':'#VALUE# часов','FD_HOUR_SHORT':'#VALUE#ч','FD_YESTERDAY':'вчера','FD_TODAY':'сегодня','FD_TOMORROW':'завтра','FD_DAY_AGO_0':'#VALUE# дней назад','FD_DAY_AGO_1':'#VALUE# день назад','FD_DAY_AGO_10_20':'#VALUE# дней назад','FD_DAY_AGO_MOD_1':'#VALUE# день назад','FD_DAY_AGO_MOD_2_4':'#VALUE# дня назад','FD_DAY_AGO_MOD_OTHER':'#VALUE# дней назад','FD_DAY_DIFF_0':'#VALUE# дней','FD_DAY_DIFF_1':'#VALUE# день','FD_DAY_DIFF_10_20':'#VALUE# дней','FD_DAY_DIFF_MOD_1':'#VALUE# день','FD_DAY_DIFF_MOD_2_4':'#VALUE# дня','FD_DAY_DIFF_MOD_OTHER':'#VALUE# дней','FD_DAY_AT_TIME':'#DAY# в #TIME#','FD_DAY_SHORT':'#VALUE#д','FD_MONTH_AGO_0':'#VALUE# месяцев назад','FD_MONTH_AGO_1':'#VALUE# месяц назад','FD_MONTH_AGO_10_20':'#VALUE# месяцев назад','FD_MONTH_AGO_MOD_1':'#VALUE# месяц назад','FD_MONTH_AGO_MOD_2_4':'#VALUE# месяца назад','FD_MONTH_AGO_MOD_OTHER':'#VALUE# месяцев назад','FD_MONTH_DIFF_0':'#VALUE# месяцев','FD_MONTH_DIFF_1':'#VALUE# месяц','FD_MONTH_DIFF_10_20':'#VALUE# месяцев','FD_MONTH_DIFF_MOD_1':'#VALUE# месяц','FD_MONTH_DIFF_MOD_2_4':'#VALUE# месяца','FD_MONTH_DIFF_MOD_OTHER':'#VALUE# месяцев','FD_MONTH_SHORT':'#VALUE#мес','FD_YEARS_AGO_0':'#VALUE# лет назад','FD_YEARS_AGO_1':'#VALUE# год назад','FD_YEARS_AGO_10_20':'#VALUE# лет назад','FD_YEARS_AGO_MOD_1':'#VALUE# год назад','FD_YEARS_AGO_MOD_2_4':'#VALUE# года назад','FD_YEARS_AGO_MOD_OTHER':'#VALUE# лет назад','FD_YEARS_DIFF_0':'#VALUE# лет','FD_YEARS_DIFF_1':'#VALUE# год','FD_YEARS_DIFF_10_20':'#VALUE# лет','FD_YEARS_DIFF_MOD_1':'#VALUE# год','FD_YEARS_DIFF_MOD_2_4':'#VALUE# года','FD_YEARS_DIFF_MOD_OTHER':'#VALUE# лет','FD_YEARS_SHORT_0':'#VALUE#л','FD_YEARS_SHORT_1':'#VALUE#г','FD_YEARS_SHORT_10_20':'#VALUE#л','FD_YEARS_SHORT_MOD_1':'#VALUE#г','FD_YEARS_SHORT_MOD_2_4':'#VALUE#г','FD_YEARS_SHORT_MOD_OTHER':'#VALUE#л','CAL_BUTTON':'Выбрать','CAL_TIME_SET':'Установить время','CAL_TIME':'Время','FD_LAST_SEEN_TOMORROW':'завтра в #TIME#','FD_LAST_SEEN_NOW':'только что','FD_LAST_SEEN_TODAY':'сегодня в #TIME#','FD_LAST_SEEN_YESTERDAY':'вчера в #TIME#','FD_LAST_SEEN_MORE_YEAR':'более года назад'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'WEEK_START':'1'});</script>
<script type="text/javascript">(window.BX||top.BX).message({'LANGUAGE_ID':'ru','FORMAT_DATE':'DD.MM.YYYY','FORMAT_DATETIME':'DD.MM.YYYY HH:MI:SS','COOKIE_PREFIX':'BITRIX_SM','SERVER_TZ_OFFSET':'10800','UTF_MODE':'Y','SITE_ID':'s1','SITE_DIR':'/','USER_ID':'','SERVER_TIME':'1771634232','USER_TZ_OFFSET':'0','USER_TZ_AUTO':'Y','bitrix_sessid':'04002f458fa481044190da60ea6d3263'});</script>
<script type="text/javascript" src="/bitrix/js/main/date/main.date.js?159955296434530"></script>
<script type="text/javascript" src="/bitrix/js/main/popup/dist/main.popup.bundle.js?1634116962109107"></script>
<script type="text/javascript" src="/bitrix/js/main/core/core_date.js?163411653136080"></script>
<script type="text/javascript" src="/bitrix/js/ui/vue/vue2/prod/dist/vue.bundle.js?1635848017173206"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.5.1/js/swiper.min.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/fingerprintjs2/2.1.0/fingerprint2.min.js"></script>
<script type="text/javascript">BX.setCSSList(['/bitrix/js/main/core/css/core_date.css','/setka/css/setka_skillbox.css','/local/templates/.default/components/bitrix/news.detail/article/style.css','/static/css/newarticle.css','/local/templates/media/libs/jquery.formstyler.css','/local/templates/media/fonts/graphik-font/stylesheet.css','/static/css/main.css','/local/templates/media/template_styles.css']);</script>
<script src="https://cdn.skillbox.pro/frontend-libs/promo-banner/5.10.1/banner-plugin.min.js"></script>
<script type="text/javascript" async src="https://relap.io/api/v6/head.js?token=sI73Ph6a5BnkqK2o"></script>
<meta property="og:title" content="Регулярные выражения в Python: синтаксис, полезные функции и задачи" />
<meta property="og:description" content="Исчерпывающий гайд по работе с мощным инструментом для анализа и обработки строк." />
<meta property="og:url" content="https://skillbox.ru/media/code/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi/" />
<meta property="og:type" content="article" />
<meta property="og:site_name" content="skillbox.ru" />
<meta property="og:locale" content="ru_RU" />
<meta property="og:image" content="https://248006.selcdn.ru/main/iblock/778/7784510dea4032c03161095301be36d8/316bda1f67fa1e63c1ff9c6097945715.jpg" />
<meta name="relap-image" content="https://248006.selcdn.ru/main/iblock/778/7784510dea4032c03161095301be36d8/316bda1f67fa1e63c1ff9c6097945715.jpg" />
<meta property="og:image:width" content="600" />
<meta property="og:image:height" content="315" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:image" content="https://248006.selcdn.ru/main/iblock/778/7784510dea4032c03161095301be36d8/316bda1f67fa1e63c1ff9c6097945715.jpg" />
<meta property="vk:image" content="https://248006.selcdn.ru/main/iblock/948/9481d099a415893f68fbf1055ea39662/8489a4c87a732befc139fca572c458b1.jpg" />
<meta property="article:author" content="Иван Стуков" />
<meta property="article:tag" content="статьи" />
<meta property="article:section" content="Код" />
<script type="text/javascript" src="/static/js/vendor.js?1771489421543641"></script>
<script type="text/javascript" src="/local/assets/js/common.js?177148933727419"></script>
<script type="text/javascript" src="/static/js/main.js?1771489421125222"></script>
<script type="text/javascript" src="/local/templates/media/js/main.js?17714893372418"></script>
<script type="text/javascript" src="/local/components/prmedia/popup.subscribe/templates/.default/script.js?17714893376820"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/infinity.js?177148933713735"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news/articles/script.js?1771489337246"></script>
<script type="text/javascript" src="/setka/js/setka_skillbox.js?1771489337106775"></script>
<script type="text/javascript" src="/local/templates/.default/components/bitrix/news.detail/article/script.js?17714893377503"></script>
<script type="text/javascript">var _ba = _ba || []; _ba.push(["aid", "84a6082a990bbac8858fb733b97bed30"]); _ba.push(["host", "skillbox.ru"]); (function() {var ba = document.createElement("script"); ba.type = "text/javascript"; ba.async = true;ba.src = (document.location.protocol == "https:" ? "https://" : "http://") + "bitrix.info/ba.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(ba, s);})();</script>
</head>
<body>
<div class="js-sticky-delimiter"></div>
<div class="bx-panel"></div>
<!-- Google Tag Manager (noscript) -->
<noscript>
<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NLCGQ25" height="0" width="0"
style="display:none;visibility:hidden"></iframe>
</noscript>
<!-- End Google Tag Manager (noscript) -->
<svg class="app-svg-visually-hidden" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<path id="def-arrow-down-a" d="M223 20813l4 5 4-5z"/>
<path id="def-arrow-a" d="M1044.6 803.2a.81.81 0 01-.5.18.8.8 0 01-.8-.8v-3.24c-2.97.1-5.17.88-6.52 2.3a4.86 4.86 0 00-1.39 3.29.8.8 0 01-.75.83h-.04a.79.79 0 01-.79-.74c-.22-3.78.69-6.76 2.69-8.84a10.76 10.76 0 016.81-3.07v-3.3a.8.8 0 011.29-.63l7.91 6.39a.8.8 0 010 1.25zm.3-11.73v2.42a.5.5 0 01-.03.1.8.8 0 01-.05.21.78.78 0 01-.47.42.67.67 0 01-.25.05h-.01c-.06 0-3.93-.04-6.46 2.62-.8.85-1.4 1.87-1.74 2.99 1.79-1.7 4.55-2.57 8.21-2.57.44 0 .8.36.8.8v2.4l5.85-4.72z"/>
<path id="def-be-a" d="M55.6 29.58h6.12v-1.59H55.6zm.64 5.74s.26-2.23 2.58-2.23c2.32 0 2.26 2.23 2.26 2.23zm-3.23 1.27S52.56 42 58.72 42c0 0 5.26.37 5.26-3.81H61.4s-.09 1.59-2.58 1.59c0 0-2.58.17-2.58-2.55l7.74-.01c-.08-.32.9-6.42-5.16-6.36-5.77.05-5.81 5.73-5.81 5.73zm-10.34 2.8v-4.24H47s1.7.16 1.7 2.24c0 1.76-1.06 1.99-1.7 2zM47 29.61s1.16.06 1.16 1.62-.76 1.64-1.49 1.64h-4v-3.26zm4.33 1.3c0-2.68-1.81-3.91-4.26-3.91H39v15.01h8.07s4.92.15 4.92-4.43c0 0 .22-3.73-2.9-3.73 0 0 2.24-.25 2.24-2.94z"/>
<path id="def-briefcase-a" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/>
<path id="def-comments-a" d="M752 8958l-4 4v-12a1 1 0 011-1h11a1 1 0 011 1v7a1 1 0 01-1 1zm12-6v13l-3.2-4H751l2-2h9v-8h1c1 0 1 .45 1 1z"/>
<path id="def-eaye-a" d="M630 8956.22c0 1.04-3.58 5.21-8 5.21s-8-4.26-8-5.21c0-1.05 3.58-5.22 8-5.22s8 4.17 8 5.22zm-5 0h-3v-3.13a3.13 3.13 0 100 6.26 3.07 3.07 0 003-3.13z"/>
<path id="def-file-a" d="M493 9457a2 2 0 01-1.98-2v-16a2 2 0 011.98-2h19.82c1.13 0 2.07.87 2.15 2v16a2.15 2.15 0 01-2.15 2zm0-18v8.83l5.3-4.59a.98.98 0 011.35.05l5.34 5.39 3.27-2.48a.98.98 0 011.36.16l3.35 4.07V9439zm19.97 14.55l-4.27-5.18-3.21 2.43c-.4.3-.95.26-1.3-.09l-5.3-5.35-5.9 5.1v4.54h19.98zm-6.1-10.55a1.98 1.98 0 113.97.04 1.98 1.98 0 01-3.97-.04z"/>
<path id="def-gplus-a" d="M466 10169a4 4 0 013.87-3.99 4.14 4.14 0 012.93.99c-.33.36-.67.71-1.03 1.04-.72-.42-1.58-.75-2.41-.46a2.52 2.52 0 00-1.67 3.23c.41 1.35 2.09 2.1 3.4 1.52a2.22 2.22 0 001.33-1.51c-.78-.01-1.56 0-2.34-.03v-1.36h3.9a4.45 4.45 0 01-.83 3.2c-1 1.28-2.88 1.66-4.4 1.16a4 4 0 01-2.75-3.79z"/><path id="def-gplus-b" d="M476.34 10166h1.32l.01 1.33H479v1.33l-1.33.01v1.33h-1.33l-.01-1.33H475v-1.33l1.33-.01.01-1.33z"/>
<path id="def-inst-a" d="M1480.93 332c-3.5 0-3.95.02-5.32.07-1.37.07-2.3.28-3.14.6-.84.34-1.57.77-2.28 1.5a6.36 6.36 0 00-1.5 2.28 9.84 9.84 0 00-.6 3.14c-.07 1.37-.07 1.82-.07 5.32s.02 3.96.07 5.32c.07 1.37.28 2.31.6 3.14.34.85.77 1.58 1.5 2.29a6.51 6.51 0 002.28 1.5c.82.3 1.77.53 3.14.6 1.37.07 1.82.07 5.32.07s3.96-.02 5.32-.07a9.48 9.48 0 003.14-.6 6.14 6.14 0 002.29-1.5 6.36 6.36 0 001.5-2.29c.3-.81.53-1.77.6-3.14.07-1.36.07-1.82.07-5.32s-.02-3.95-.07-5.32a9.48 9.48 0 00-.6-3.14 6.14 6.14 0 00-1.5-2.28 6.36 6.36 0 00-2.29-1.5 9.84 9.84 0 00-3.14-.6c-1.38-.05-1.82-.07-5.32-.07zm0 2.32c3.45 0 3.85.02 5.22.07 1.27.05 1.94.26 2.4.45.6.25 1.03.52 1.48.97.45.45.73.89.97 1.5.18.44.39 1.14.45 2.39.07 1.37.07 1.76.07 5.21s-.01 3.85-.07 5.22a6.55 6.55 0 01-.45 2.4c-.24.6-.52 1.03-.97 1.48-.45.45-.88.73-1.49.97-.45.18-1.14.39-2.39.45-1.37.07-1.77.07-5.22.07-3.45 0-3.84-.01-5.21-.07a6.55 6.55 0 01-2.4-.45 4.11 4.11 0 01-1.49-.97 4.11 4.11 0 01-.97-1.49 7.52 7.52 0 01-.45-2.39c-.07-1.37-.07-1.77-.07-5.22 0-3.45.02-3.84.07-5.21.05-1.27.26-1.95.45-2.4.25-.6.52-1.04.97-1.49.45-.45.89-.72 1.5-.97a7.52 7.52 0 012.39-.45c1.35-.05 1.76-.07 5.21-.07z"/><path id="def-inst-b" d="M1480.93 349.2a4.3 4.3 0 110-8.59 4.3 4.3 0 010 8.6zm0-10.93a6.62 6.62 0 100 13.24 6.62 6.62 0 000-13.24z"/><path id="def-inst-c" d="M1486.27 338.01a1.54 1.54 0 113.09 0 1.54 1.54 0 01-3.09 0z"/>
<path id="def-like-down-a" d="M1004.33 543.66c-1.1 0-2.45-.86-2.61-3.31-.05-1.41.11-2.82.48-4.19h-2.96c-2.15 0-3.42-1.35-3.42-2.67 0-.39.05-.77.17-1.13a2.4 2.4 0 01-.99-2.03 2.35 2.35 0 011.02-2.05c-.12-.34-.18-.7-.17-1.06.86-.6 1.2-1.7.86-2.7 0-2.52 3.45-2.52 4.57-2.52h2.85c1.3.06 2.56.4 3.71 1 .67.36 1.41.6 2.18.67h3.23c.25 0 .5.11.65.31.12.14 1.1 1.47 1.1 4.69.03 1.8-.28 3.6-.9 5.31a.83.83 0 01-.67.5c-.03 0-3.27.4-4.85 1.98a10.32 10.32 0 00-2.8 5.94 1.4 1.4 0 01-1.45 1.26zm-6.84-10.17c0 .34.52 1 1.75 1h4.06a.83.83 0 01.8 1.1c-.5 1.5-.73 3.07-.72 4.65.08 1.1.44 1.6.79 1.72a11.94 11.94 0 013.23-6.67c1.57-1.58 4.2-2.18 5.32-2.38.41-1.37.62-2.8.61-4.24a8.18 8.18 0 00-.56-3.34h-2.75c-1-.07-1.97-.35-2.85-.81a7.53 7.53 0 00-3.04-.85h-2.85c-1.32 0-2.9.15-2.9.85-.02.11.02.22.09.3a.73.73 0 01.75.77.92.92 0 01-.85.87.85.85 0 00-.85.77c-.05.22.01.44.17.6.42.07.71.45.67.88a.87.87 0 01-.86.77.77.77 0 00-.83.85.8.8 0 00.87.85c.46.01.82.4.81.85 0 .43-.33.78-.76.8-.09.21-.12.44-.1.66z"/>
<path id="def-like-up-a" d="M944.67 520c1.1 0 2.45.87 2.61 3.32.05 1.4-.11 2.82-.48 4.18h2.96c2.15 0 3.42 1.36 3.42 2.67 0 .39-.05.77-.17 1.14a2.4 2.4 0 01.99 2.02c.04.81-.35 1.59-1.02 2.05.12.34.18.7.17 1.07-.86.6-1.2 1.7-.86 2.69 0 2.52-3.45 2.52-4.57 2.52h-2.85a8.94 8.94 0 01-3.71-.99 5.67 5.67 0 00-2.18-.67h-3.23a.83.83 0 01-.65-.32c-.12-.14-1.1-1.47-1.1-4.68-.03-1.81.28-3.62.9-5.32a.83.83 0 01.67-.5c.03 0 3.27-.4 4.85-1.98a10.32 10.32 0 002.8-5.93 1.4 1.4 0 011.45-1.27zm6.84 10.17c0-.34-.52-1-1.75-1h-4.06a.83.83 0 01-.8-1.1c.5-1.5.73-3.07.72-4.65-.08-1.1-.44-1.6-.79-1.72a11.94 11.94 0 01-3.23 6.67c-1.57 1.58-4.2 2.19-5.32 2.38a14.38 14.38 0 00-.61 4.25 8.18 8.18 0 00.56 3.33h2.75c1 .07 1.97.35 2.85.82.94.49 1.98.78 3.04.85h2.85c1.32 0 2.9-.15 2.9-.86a.35.35 0 00-.09-.3.73.73 0 01-.75-.77.92.92 0 01.85-.87c.44 0 .81-.33.85-.77a.65.65 0 00-.17-.6.81.81 0 01-.67-.87.87.87 0 01.86-.78.77.77 0 00.83-.85.8.8 0 00-.87-.85.83.83 0 01-.81-.85c0-.43.33-.78.76-.8.09-.21.12-.43.1-.66z"/>
<path id="def-like-a" d="M701.32 8960.32a.95.95 0 01-.95.95h-5.72c-.96 0-1.92-.95-2.87-.95h-.95v-6.68c.04-.6.4-1.12.95-1.36a4.78 4.78 0 002.87-4.37v-.96a.95.95 0 01.95-.95h.95c.53 0 .95.43.95.95v5.73h3.82a.9.9 0 01.96.96zm-14.31.95v-9.54h1.9a.96.96 0 01.97.95v7.64a.96.96 0 01-.96.95zm.99-8.3a.48.48 0 10.88.38.48.48 0 00-.88-.38z"/>
<path id="def-link-a" d="M626.02 1163.93l-.02 15.99 13.02.01v-4a.86.86 0 01.24-.68.9.9 0 01.66-.28 1 1 0 011 1v4.95a1 1 0 01-.29.7 1 1 0 01-.71.29H625a1 1 0 01-.71-.29 1 1 0 01-.29-.7V1163a1 1 0 011-1h3.95a1 1 0 011 1 .89.89 0 01-.93.93z"/><path id="def-link-b" d="M641.95 1171a1 1 0 01-1-1v-5.59l-9.25 9.3a.99.99 0 01-1.41-.01.99.99 0 01.01-1.41l9.24-9.29h-5.56a1 1 0 01-1-1 1 1 0 011-1h7.97a1 1 0 011 1v8a1 1 0 01-1 1z"/>
<path id="def-mail-a" d="M1058 261c0-.6-.4-1-1-1h-14c-.6 0-1 .4-1 1l8 6.5z"/><path id="def-mail-b" d="M1042 262.5v8.5c0 .6.4 1 1 1h14c.6 0 1-.4 1-1v-8.5l-8 6.5z"/>
<path id="def-outside-a" d="M1204.24 9231.16h-10.05c-.92 0-1.67-.75-1.67-1.68v-4.2c0-.46.38-.84.84-.84a.81.81 0 01.8.84v4.2h10.08v-16.8h-10.08v4.2a.81.81 0 01-.8.84.84.84 0 01-.84-.84v-4.2c0-.93.75-1.68 1.67-1.68h10.05c.92 0 1.67.75 1.67 1.68v16.8c0 .93-.75 1.68-1.67 1.68zm-15.56-10.92h11.37a.84.84 0 110 1.68h-11.36l1.91 1.92a.84.84 0 11-1.18 1.2l-3.35-3.36a.86.86 0 01-.24-.6v-.02a.83.83 0 01.24-.58l3.35-3.36a.83.83 0 011.18 0c.33.33.33.87 0 1.2z"/>
<path id="def-pencil-a" d="M1190.84 9818.68a.64.64 0 01-.19.13l-.07.06-4.42 1.82c-.1.05-.21.07-.32.07a.83.83 0 01-.77-1.15l1.84-4.4v-.02a.38.38 0 01.09-.13l.08-.13v-.01l10.82-10.82-.44-.44-3.56 3.57a.83.83 0 01-1.18-1.18l4.16-4.15a.81.81 0 011.17 0l1.03 1.03 1.86-1.86a.84.84 0 011.17 0l2.58 2.58c.33.32.33.85 0 1.18zm-2.88-1.7l-.58 1.41 1.41-.58zm.88-1.47l1.41 1.4 10.24-10.23-1.4-1.4zm12.69-12.68l-1.27 1.27 1.4 1.4 1.28-1.27z"/>
<path id="def-phone-a" d="M732.62 41c-2.25 0-6.37-2.73-10.24-6.78a33.08 33.08 0 01-5.22-6.96c-1.33-2.53-1.52-4.32-.56-5.31l2.91-2.72c.17-.16.4-.24.63-.23.24.02.46.13.61.32l3.79 4.58c.23.28.28.68.12 1.01l-1.47 3.08 5.24 5.48 2.93-1.54a.83.83 0 01.96.12l4.38 3.96c.17.16.28.38.3.63a.97.97 0 01-.22.67l-2.53 3.02c-.33.34-.81.67-1.63.67zm-14.76-17.78c-.15.21-.25 1.09.83 3.15 1.06 2 2.8 4.32 4.93 6.55 3.87 4.06 7.53 6.25 9 6.25.2 0 .3-.04.33-.08l1.94-2.3-3.27-2.95-2.98 1.56a.84.84 0 01-1.01-.17l-6.12-6.42a.92.92 0 01-.16-1.05l1.48-3.12-2.82-3.42z"/>
<path id="def-plus-a" d="M1223.33 4172.67h-6.66v6.66a.67.67 0 01-1.34 0v-6.66h-6.66a.67.67 0 010-1.34h6.66v-6.66a.67.67 0 011.34 0v6.66h6.66a.67.67 0 010 1.34z"/>
<path id="def-search-a" d="M1092.53 24.87a6.7 6.7 0 10-.05 13.4 6.7 6.7 0 00.05-13.4zm12.1 18.85a.95.95 0 01-1.35 0l-5.4-5.43a8.62 8.62 0 111.35-1.35l5.4 5.43c.37.37.37.98 0 1.35z"/>
<path id="def-shape-a" d="M879 13323h-4a1 1 0 01-1-1v-4a1 1 0 011-1h.85c-1.29-8.14-8.38-15.22-16.85-16.81v.81a1 1 0 01-1 1h-4a1 1 0 01-1-1v-.81c-8.47 1.6-15.56 8.67-16.85 16.81h.85a1 1 0 011 1v4a1 1 0 01-1 1h-4a1 1 0 01-1-1v-4a1 1 0 011-1h1.13c1.03-7.24 6.24-13.76 13.07-17h-6.48a1.98 1.98 0 01-1.72 1.01c-.97 0-1.8-.69-1.98-1.65a2 2 0 011.28-2.23 2 2 0 012.42.87H853v-1a1 1 0 011-1h4a1 1 0 011 1v1h12.27a2.01 2.01 0 110 2h-6.47c6.83 3.24 12.04 9.76 13.07 17H879a1 1 0 011 1v4a1 1 0 01-1 1zm-43-4h-2v2h2zm21-21h-2v2h2zm21 21h-2v2h2zm-22.93-12.51a.52.52 0 01.1-.18l.01-.03.03-.03a1 1 0 01.2-.21l.06-.04c.06-.04.12-.08.19-.1l.04-.02.09-.01.05-.01.16-.03.15.03h.04l.11.01.04.02.19.1.02.02.02.01a.92.92 0 01.24.25l.02.03c.04.05.08.12.1.18l.03.05c.02.07 2.33 7.26 8.51 10.59.26.14.45.39.51.68a.97.97 0 01-.2.82 23.7 23.7 0 00-3.99 8.81 8.02 8.02 0 012.21 5.57 1 1 0 01-1 1h-14a1 1 0 01-1-1 8.02 8.02 0 012.21-5.57 23.66 23.66 0 00-3.99-8.8 1 1 0 01.31-1.51c6.21-3.34 8.49-10.52 8.51-10.59l.03-.04zm.93 20.49a6 6 0 00-5.92 5.02h11.84a6 6 0 00-5.92-5.02zm-4.06-.9a8.17 8.17 0 018.12 0 25.8 25.8 0 013.47-7.78 20.33 20.33 0 01-6.53-6.96v6.93a2 2 0 01-.97 3.73 2.03 2.03 0 01-2.03-2 2 2 0 011-1.7v-6.96a20.33 20.33 0 01-6.53 6.96 25.8 25.8 0 013.47 7.78z"/>
<path id="def-strawberry-a" d="M873.26 13427.96a7.49 7.49 0 01-4.13-1.21 20.45 20.45 0 012.02 8.92c0 10.41-17.26 18.25-28.46 18.25-3.71 0-6.53-.86-8.17-2.48l-.1-.1c-3.9-4.01-2.65-13.97.62-21.78 3.77-9.01 9.53-14.39 15.41-14.39 3.1 0 6.17.68 8.97 1.99a8.12 8.12 0 01-.65-1.24c-1.09-2.7-.53-5.87 1.68-9.44a1 1 0 011.11-.45c.21.06 5.12 1.38 6.8 5.49.8 2.19.7 4.61-.29 6.72 1.25-.51 2.58-.79 3.92-.83 5.12 0 7.74 4.75 8.4 7.26a.97.97 0 01-.45 1.1 12.95 12.95 0 01-6.68 2.19zm-36.36 2.36c-3.42 8.19-3.85 16.84-.97 19.69l.08.09c1.26 1.18 3.62 1.82 6.68 1.82a38.27 38.27 0 0017.26-4.82c3.43-1.92 9.18-5.96 9.18-11.43a18.4 18.4 0 00-18.68-18.5c-5.93 0-10.89 6.79-13.55 13.15zm29.59-18.05c-.97-2.38-3.49-3.6-4.73-4.07-1.52 2.71-1.89 5.05-1.12 6.96.96 2.37 3.48 3.6 4.73 4.08 1.52-2.71 1.89-5.05 1.12-6.97zm5.5 7.13c-1.75.08-3.45.6-4.95 1.51.59 1.54 2.36 5.06 6.22 5.06 1.75-.08 3.45-.6 4.94-1.5-.59-1.55-2.36-5.07-6.21-5.07zm-13.43 13.54h3v3h-3zm-4-5h3v3h-3zm2 13h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm2 22h-3v-3h3zm-7-8h3v3h-3zm0-9h3v3h-3zm-5 14h3v3h-3zm0-9h3v3h-3z"/>
<path id="def-telegram-a" d="M823.8 272.93l-4.09 20.05c-.3 1.42-1.16 1.76-2.36 1.1l-6.52-4.77-3.13 3c-.55.47-.75.66-1.27.65-.5 0-.74-.3-1.03-1.1l-2.4-7.29-6.26-1.94c-1.01-.32-1.06-1.66.31-2.05l25.01-9.39c1.14-.52 2.18 0 1.74 1.74zm-17.39 18.55l.6-5.26 11.83-10.54c.31-.36.09-.88-.61-.42l-14.24 8.87z"/>
<path id="def-tm-a" d="M1406.46 346.34l13.28-8.34c.65-.44.86.05.57.39l-11.02 9.91-.57 4.96zm16.84-12.16l-23.32 8.83c-1.27.37-1.24 1.62-.3 1.93l5.84 1.82 2.24 6.86c.28.75.5 1.04.96 1.04.49 0 .67-.18 1.19-.62.58-.55 1.5-1.43 2.92-2.83l6.08 4.49c1.12.62 1.92.3 2.21-1.04l3.8-18.85c.41-1.63-.55-2.12-1.62-1.63z"/>
<path id="def-trash-a" d="M1175 9805h-1.09l-1.8 13.12a2.15 2.15 0 01-2.11 1.88h-8a2.14 2.14 0 01-2.1-1.88l-1.78-13.12H1157a1 1 0 010-2h5v-1a3 3 0 013-3h2a3 3 0 013 3v1h5a1 1 0 010 2zm-7-3a1 1 0 00-1-1h-2a1 1 0 00-1 1v1h4zm-7.87 3l1.75 12.9c.02.05.07.09.12.1h8c.06-.01.1-.05.12-.11l1.78-12.89zm6.87 3h2v6h-2zm-4 0h2v6h-2z"/>
<path id="def-triangle-a" d="M1238 6883l7.22 7.22 7.22-7.22z"/>
<path id="def-user-circle-a" d="M1265.24 30.18a10 10 0 01-2.18 10.9 6.94 6.94 0 00-4.7-4.69 5 5 0 10-4.66.01c-2.24.72-4 2.47-4.72 4.71a10 10 0 1116.26-10.93zm-6.22 1.82a3 3 0 11-6-.01 3 3 0 016 .01zm-8.3 10.48c.4-2.6 2.65-4.5 5.28-4.48 2.73 0 5.1 1.96 5.27 4.37l.03.09a9.9 9.9 0 01-10.57.02zM1256 46a12.01 12.01 0 000-24 12 12 0 100 24z"/>
<path id="def-vb-a" d="M955.45 276.38c.68 3.25.79 6.51-.02 9.76-.14.57-.36 1.11-.58 1.65-.84 2.05-2.5 3.13-4.57 3.73-1.63.48-3.31.69-5 .82-.89.07-2.29.03-3.18.02-.76-.01-.55-.04-1.04.45-.96.97-1.84 1.82-2.76 2.84a28 28 0 01-1.35 1.35v-4.93c0-.25-.07-.4-.3-.5-.26-.1-.5-.24-.75-.34a6.95 6.95 0 01-4.35-4.98 19.93 19.93 0 01-.51-6.16c.07-1.4.26-2.79.64-4.15a6.8 6.8 0 013.48-4.25 13.83 13.83 0 014.79-1.47 25.9 25.9 0 019.8.59 8.9 8.9 0 013.5 1.69 6.59 6.59 0 012.2 3.88zm-12.05-1.52c.54.04 1.07.15 1.6.28 1.98.5 3.52 1.53 4.32 3.43.42.99.63 2.02.7 3.08.02.27.15.42.43.42.27-.01.38-.19.39-.43.02-.21.01-.42.01-.64a7.41 7.41 0 00-1.39-4.12c-1.49-1.96-3.43-2.7-6-2.82-.31-.02-.49.1-.51.42-.01.31.21.36.45.38zm4.39 4.61c.11.4.21.81.26 1.22.03.27-.03.64.42.65.32.01.4-.13.43-.67a4.58 4.58 0 00-.68-2.46c-.96-1.52-2.37-2.16-4.16-2.32-.28-.03-.48.08-.52.37-.05.3.14.44.41.48.55.08 1.08.22 1.6.4a3.32 3.32 0 012.24 2.33zm-2.22-1.46a2.29 2.29 0 00-.89-.22c-.38.03-.58.19-.58.45.01.33.3.33.52.39l.27.06c.72.19 1.13.65 1.27 1.36.03.13.04.27.08.4.06.18.18.31.4.31.21-.01.34-.13.39-.32l.04-.35a2.4 2.4 0 00-1.5-2.08zm4.89 7.94c-.78-.65-1.6-1.25-2.47-1.78-1.02-.62-1.77-.45-2.47.49l-.11.14c-.32.39-.72.54-1.22.4a5.89 5.89 0 01-1.51-.74 6.76 6.76 0 01-2.77-3.19c-.35-.82-.19-1.35.54-1.88l.28-.2c.55-.45.68-.89.37-1.52a9.94 9.94 0 00-2.3-3.05 1.3 1.3 0 00-.97-.36 2.9 2.9 0 00-2.62 2.74c-.01.37.08.78.24 1.17 2.23 5.38 6.16 9.1 11.6 11.36.4.17.82.27 1.25.15a3.75 3.75 0 002.55-2.16c.28-.61.14-1.13-.39-1.57z"/>
<path id="def-ynadex-a" d="M471.93 10326.44h-.59c-.92 0-1.8-.64-1.8-2.24 0-1.67.83-2.35 1.68-2.35h.7v4.59zm.92-5.44h-1.6c-1.55 0-2.87 1.13-2.87 3.33 0 1.32.64 2.3 1.78 2.78l-2.13 3.68c-.07.12 0 .21.1.21h1c.08 0 .14-.03.17-.1l1.93-3.6h.7v3.6c0 .05.04.1.1.1h.86c.08 0 .11-.04.11-.1v-9.77c0-.09-.06-.13-.15-.13z"/>
<path id="def-ytube-a" d="M1343.37 349.72v-9.44l6.27 4.72zm-7.81-14.03a3.54 3.54 0 00-3.56 3.51v11.6a3.54 3.54 0 003.56 3.51h19.88a3.54 3.54 0 003.56-3.5V339.2a3.54 3.54 0 00-3.56-3.51h-19.88z"/>
</defs>
<symbol id="icon-arrow-chevron" viewBox="0 0 9 15"><path d="M7.07.862L0 7.93 7.072 15l1.06-1.06-6.011-6.01L8.13 1.922 7.07.862z"/></symbol>
<symbol id="icon-arrow-down" viewBox="0 0 8 5"><use xlink:href="#def-arrow-down-a" transform="translate(-223 -20813)"/></symbol>
<symbol id="icon-arrow-left" viewBox="0 0 18 12"><path d="M.1 6.3c-.1-.3 0-.6.1-.8l4.3-4.3c.3-.3.7-.3 1 0 .3.3.3.7 0 1l-3 3.1h14.1c.4 0 .7.3.7.7 0 .4-.3.7-.7.7H2.5l3.1 3.1c.3.3.3.8 0 1-.2.2-.3.2-.4.3-.2.1-.5 0-.7-.2L.2 6.6c-.1-.1-.1-.2-.1-.3z"/></symbol>
<symbol id="icon-arrow-menu" viewBox="0 0 10 5"><path fill-rule="evenodd" clip-rule="evenodd" d="M0 0l5 5 5-5H0z"/></symbol>
<symbol id="icon-arrow-right" viewBox="0 0 15 12"><path d="M14.19 5.77c.11.26.05.57-.15.78l-4.32 4.33a.72.72 0 01-1.02 0 .72.72 0 010-1.02l3.09-3.1H.69A.72.72 0 010 6.04c0-.38.31-.7.69-.72h11.1L8.7 2.23a.73.73 0 01.33-1.21c.24-.06.51.01.69.19l4.32 4.32a.6.6 0 01.15.24z"/></symbol>
<symbol id="icon-arrow" viewBox="0 0 20 17"><use xlink:href="#def-arrow-a" transform="translate(-1033 -789)"/></symbol>
<symbol id="icon-be" viewBox="0 0 25 16"><use xlink:href="#def-be-a" transform="translate(-39 -27)"/></symbol>
<symbol id="icon-be2-mob" viewBox="0 0 34 34"><path d="M15.426 16.508s1.507-.112 1.507-1.879S15.7 12 14.138 12H9v9.875h5.138s3.137.099 3.137-2.915c0 0 .137-2.452-1.85-2.452zm-4.162-2.753h2.874s.699 0 .699 1.027c0 1.028-.411 1.177-.877 1.177h-2.696v-2.204zm2.742 6.365h-2.742v-2.64h2.874s1.041-.013 1.041 1.357c0 1.142-.761 1.271-1.173 1.283zM23.408 12.582h-4.074v1.216h4.074v-1.216zM21.458 14.513c-3.797 0-3.794 3.793-3.794 3.793s-.26 3.775 3.794 3.775c0 0 3.38.193 3.38-2.626H23.1s.058 1.062-1.584 1.062c0 0-1.737.116-1.737-1.718h5.116s.56-4.286-3.437-4.286zm1.545 2.968h-3.244s.213-1.522 1.738-1.522 1.506 1.522 1.506 1.522z"/></symbol>
<symbol id="icon-be2" viewBox="0 0 56 56"><path d="M27.475 27.946s1.987-.148 1.987-2.479c0-2.33-1.625-3.467-3.685-3.467H19v13.024h6.777s4.137.13 4.137-3.844c0 0 .18-3.234-2.439-3.234zm-5.489-3.631h3.791s.921 0 .921 1.355-.542 1.551-1.156 1.551h-3.556v-2.906zm3.616 8.394h-3.616v-3.48h3.79s1.374-.018 1.374 1.788c0 1.506-1.004 1.677-1.548 1.692zM38.004 22.767H32.63v1.604h5.373v-1.604zM35.432 25.314c-5.009 0-5.004 5.003-5.004 5.003s-.344 4.98 5.004 4.98c0 0 4.456.254 4.456-3.464h-2.292s.077 1.4-2.088 1.4c0 0-2.291.154-2.291-2.266h6.748s.738-5.653-4.533-5.653zm2.037 3.915H33.19s.28-2.008 2.291-2.008c2.013 0 1.987 2.008 1.987 2.008z"/></symbol>
<symbol id="icon-briefcase" viewBox="834 13519 48 44"><path d="M836.5 13563c-1.4 0-2.5-1.2-2.5-2.6v-19.4c0 .6.4 1 1 1h1v18.4c0 .3.2.6.5.6h42.9c.3 0 .5-.3.5-.6v-18.4h1c.6 0 1-.4 1-1s-.4-1-1-1h-1v-10.4c0-.3-.2-.5-.5-.6h-42.9c-.3 0-.5.3-.5.6v10.4h-1c-.6 0-1 .4-1 1v-11.4c0-1.4 1.1-2.5 2.5-2.6H849v1c0 .6.4 1 1 1s1-.4 1-1v-1h14v1c0 .6.4 1 1 1 .3 0 .5-.1.7-.3.2-.2.3-.4.3-.7v-1h12.5c1.4 0 2.5 1.2 2.5 2.6v30.9c0 1.4-1.1 2.6-2.5 2.6h-43zm18.4-21H836v-2h18.9c.6 0 1 .4 1 1s-.4 1-1 1zm25.1-2v2h-18.9c-.6 0-1-.4-1-1s.4-1 1-1H880zm-13-16.8c0-2.3-1.9-4.2-4.2-4.2h-9.6c-2.3 0-4.2 1.9-4.2 4.2v3.8h2v-3.8c0-1.2 1-2.2 2.2-2.2h9.6c1.2 0 2.2 1 2.2 2.2v3.8h2v-3.8z"/><clipPath id="def-briefcase-b"><use xlink:href="#def-briefcase-a" overflow="visible"/></clipPath><g clip-path="url(#def-briefcase-b)"><path stroke-width="4" stroke-miterlimit="50" d="M855 13538c0-1.7 1.3-3 3-3s3 1.3 3 3v7c0 1.7-1.3 3-3 3s-3-1.3-3-3v-7z"/></g></symbol>
<symbol id="icon-burger" viewBox="0 0 20 14"><g fill-rule="evenodd"><path d="M0 0h20v2H0zM0 6h20v2H0zM0 12h20v2H0z"/></g></symbol>
<symbol id="icon-cancel-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zm0-22a10 10 0 100 20 10 10 0 000-20zm4.71 13.29L13.41 12l3.3-3.29a1 1 0 00-.02-1.4 1 1 0 00-1.4-.02L12 10.59l-3.29-3.3a1 1 0 00-1.4.02 1 1 0 00-.02 1.4l3.3 3.29-3.3 3.29a1 1 0 00.02 1.4 1 1 0 001.4.02l3.29-3.3 3.29 3.3a1 1 0 001.42 0 1 1 0 000-1.42z"/></symbol>
<symbol id="icon-clip" viewBox="0 0 25 22"><path d="M12.1 21.37a1.02 1.02 0 01-.71-1.73L21.74 9.11a4.19 4.19 0 000-5.87 4.04 4.04 0 00-5.78 0l-12 12.21c-.59.49-.94 1.2-.97 1.97.05.49.28.95.63 1.29.31.35.77.53 1.23.48.74-.17 1.4-.57 1.89-1.15l9.42-9.58a.98.98 0 011.41 0c.39.4.39 1.04 0 1.44l-9.42 9.58A5.3 5.3 0 015.1 21.2a3.37 3.37 0 01-2.89-1.05A4.16 4.16 0 011 17.54a4.62 4.62 0 011.55-3.53l12-12.2a6.03 6.03 0 018.6 0 6.24 6.24 0 010 8.74L12.8 21.07a.98.98 0 01-.7.3z"/></symbol>
<symbol id="icon-clock" viewBox="0 0 24 24"><path d="M0 12a12 12 0 1124 0 12 12 0 01-24 0zm2 0a10 10 0 1020 0 10 10 0 00-20 0zm14 5a1 1 0 00.71-1.71L13 11.59V5a1 1 0 00-1-1 1 1 0 00-1 1v7a1 1 0 00.08.38c.05.12.12.24.21.33l4 4c.19.18.45.29.71.29z"/></symbol>
<symbol id="icon-close-menu" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.636 2.303L13.97.636 8.136 6.469 2.303.636.636 2.303 6.47 8.136.636 13.97l1.667 1.667 5.833-5.833 5.833 5.833 1.667-1.666-5.833-5.834 5.833-5.833z"/></symbol>
<symbol id="icon-close" viewBox="0 0 16 15"><g fill-rule="evenodd"><path d="M1.963.045l13.791 12.86-1.364 1.463L.6 1.508z"/><path d="M14.39.045L.6 12.905l1.364 1.463 13.79-12.86z"/></g></symbol>
<symbol id="icon-comments" viewBox="0 0 16 16"><use xlink:href="#def-comments-a" transform="translate(-748 -8949)"/></symbol>
<symbol id="icon-eaye" viewBox="0 0 16 11"><use xlink:href="#def-eaye-a" transform="translate(-614 -8951)"/></symbol>
<symbol id="icon-fb" viewBox="0 0 13 25"><path d="M8.44 25V13.6h3.83l.58-4.45H8.44V6.31c0-1.28.36-2.16 2.2-2.16H13V.18A29.7 29.7 0 009.57 0c-3.4 0-5.73 2.07-5.73 5.87v3.28H0v4.45h3.84V25z"/></symbol>
<symbol id="icon-fb2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M18.415 24.638v-7.131h2.457l.366-2.784h-2.823v-1.776c0-.8.23-1.351 1.411-1.351h1.514v-2.49A21.931 21.931 0 0019.14 9c-2.182 0-3.677 1.295-3.677 3.672v2.051H13v2.784h2.463v7.13h2.952z"/></symbol>
<symbol id="icon-fb2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M30.142 38.625V29.22h3.24l.483-3.671H30.14v-2.343c0-1.056.305-1.782 1.862-1.782H34V18.14a28.937 28.937 0 00-2.902-.14c-2.877 0-4.849 1.708-4.849 4.843v2.706H23v3.671h3.25v9.405h3.892z"/></symbol>
<symbol id="icon-file" viewBox="0 0 24 20"><use xlink:href="#def-file-a" transform="translate(-491 -9437)"/></symbol>
<symbol id="icon-github-mob" viewBox="0 0 34 34"><path d="M17.2 10c-3.978 0-7.2 3.307-7.2 7.386 0 3.263 2.063 6.031 4.923 7.007.36.07.492-.16.492-.355 0-.175-.006-.64-.009-1.256-2.003.445-2.425-.99-2.425-.99-.328-.853-.801-1.081-.801-1.081-.652-.458.05-.449.05-.449.723.052 1.103.761 1.103.761.642 1.13 1.685.803 2.097.615.065-.478.25-.803.456-.988-1.599-.185-3.28-.82-3.28-3.65 0-.806.28-1.464.741-1.981-.08-.187-.324-.938.063-1.955 0 0 .603-.198 1.98.757a6.754 6.754 0 011.8-.25 6.754 6.754 0 011.8.25c1.368-.955 1.971-.757 1.971-.757.387 1.017.144 1.768.072 1.955.46.517.738 1.175.738 1.981 0 2.838-1.683 3.462-3.285 3.644.252.222.486.674.486 1.366 0 .989-.009 1.783-.009 2.023 0 .193.126.424.495.35 2.881-.969 4.942-3.739 4.942-6.997 0-4.079-3.224-7.386-7.2-7.386z"/></symbol>
<symbol id="icon-github" viewBox="0 0 56 56"><path d="M27.913 19C22.436 19 18 23.362 18 28.741c0 4.305 2.84 7.955 6.778 9.242.496.092.677-.21.677-.468 0-.232-.008-.844-.012-1.657-2.758.588-3.34-1.306-3.34-1.306-.45-1.125-1.102-1.425-1.102-1.425-.898-.604.07-.592.07-.592.995.068 1.518 1.004 1.518 1.004.884 1.49 2.32 1.059 2.887.81.09-.63.344-1.059.628-1.302-2.202-.244-4.515-1.082-4.515-4.814 0-1.063.384-1.932 1.02-2.614-.112-.246-.446-1.236.086-2.578 0 0 .83-.26 2.727.999a9.676 9.676 0 012.478-.329 9.676 9.676 0 012.478.329c1.883-1.26 2.714-.999 2.714-.999.532 1.342.198 2.332.099 2.578a3.737 3.737 0 011.016 2.614c0 3.742-2.317 4.566-4.523 4.805.347.293.67.89.67 1.803 0 1.303-.013 2.35-.013 2.667 0 .255.173.56.681.463 3.966-1.279 6.804-4.932 6.804-9.23 0-5.38-4.439-9.741-9.913-9.741z"/></symbol>
<symbol id="icon-gplus" viewBox="0 0 13 8"><use xlink:href="#def-gplus-a" transform="translate(-466 -10165)"/><use xlink:href="#def-gplus-b" transform="translate(-466 -10165)"/></symbol>
<symbol id="icon-head" viewBox="0 0 54 45"><g transform="translate(2 2)" fill-rule="evenodd"><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" fill-rule="nonzero"/><path stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" d="M46.923 13.25L22.99 0 0 14.007l23.179 13.44L46.923 13.25V30"/><path d="M9.23 19.458v17.61s14.232 8.328 28.462 0V19.231" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><circle stroke-width="3" fill-rule="nonzero" stroke-linecap="round" stroke-linejoin="round" cx="47.308" cy="32.692" r="2.692"/><path d="M32.733 18.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865-3.694-1.99-7.403-3.98-11.097-5.957-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957zM36.733 15.745c.53.295 1.074.575 1.604.87 1.302.7 2.468-1.164 1.181-1.865a4281.61 4281.61 0 00-11.097-5.957c-.53-.294-1.075-.575-1.604-.869-1.302-.7-2.468 1.163-1.181 1.864 3.694 1.99 7.403 3.981 11.097 5.957z" fill-rule="nonzero"/></g></symbol>
<symbol id="icon-inst" viewBox="0 0 26 26"><use xlink:href="#def-inst-a" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-b" transform="translate(-1468 -332)"/><use xlink:href="#def-inst-c" transform="translate(-1468 -332)"/></symbol>
<symbol id="icon-instagram-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M24.027 20.23a3.801 3.801 0 01-3.797 3.797h-6.433A3.801 3.801 0 0110 20.23v-6.433A3.801 3.801 0 0113.797 10h6.433a3.801 3.801 0 013.797 3.797v6.433zm-7.014-7.052a3.84 3.84 0 00-3.835 3.835 3.84 3.84 0 003.835 3.836 3.84 3.84 0 003.836-3.836 3.84 3.84 0 00-3.836-3.835zm0 6.848A3.016 3.016 0 0114 17.013 3.016 3.016 0 0117.013 14a3.016 3.016 0 013.013 3.013 3.016 3.016 0 01-3.013 3.013zm2.794-7.077c0-.625.509-1.133 1.133-1.133.625 0 1.134.508 1.134 1.133s-.509 1.134-1.134 1.134a1.135 1.135 0 01-1.133-1.134z"/></symbol>
<symbol id="icon-instagram" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M37.5 32.492a5.014 5.014 0 01-5.008 5.008h-8.484A5.014 5.014 0 0119 32.492v-8.484A5.014 5.014 0 0124.008 19h8.484a5.014 5.014 0 015.008 5.008v8.484zm-9.25-9.3a5.064 5.064 0 00-5.058 5.058c0 2.79 2.269 5.059 5.058 5.059 2.79 0 5.059-2.27 5.059-5.059 0-2.79-2.27-5.058-5.059-5.058zm0 9.032a3.978 3.978 0 01-3.974-3.974 3.978 3.978 0 013.974-3.974 3.978 3.978 0 013.974 3.974 3.978 3.978 0 01-3.974 3.974zm3.685-9.334c0-.825.67-1.495 1.494-1.495.825 0 1.495.67 1.495 1.495 0 .824-.67 1.495-1.495 1.495-.824 0-1.494-.67-1.494-1.495z"/></symbol>
<symbol id="icon-like-down" viewBox="0 0 20 22"><use xlink:href="#def-like-down-a" transform="translate(-995 -522)"/></symbol>
<symbol id="icon-like-up" viewBox="0 0 20 22"><use xlink:href="#def-like-up-a" transform="translate(-934 -520)"/></symbol>
<symbol id="icon-like" viewBox="0 0 16 16"><use xlink:href="#def-like-a" transform="translate(-687 -8946)"/></symbol>
<symbol id="icon-link" viewBox="0 0 19 21"><use xlink:href="#def-link-a" transform="translate(-624 -1161)"/><use xlink:href="#def-link-b" transform="translate(-624 -1161)"/></symbol>
<symbol id="icon-mail" viewBox="0 0 16 12"><use xlink:href="#def-mail-a" transform="translate(-1042 -260)"/><use xlink:href="#def-mail-b" transform="translate(-1042 -260)"/></symbol>
<symbol id="icon-minus-zoom" viewBox="0 0 26 2"><path stroke-linecap="square" stroke-miterlimit="50" stroke-width="2" d="M1.5 1h23.19"/></symbol>
<symbol id="icon-outside" viewBox="0 0 21 21"><use xlink:href="#def-outside-a" transform="translate(-1185 -9211)"/></symbol>
<symbol id="icon-pencil" viewBox="0 0 20 21"><use xlink:href="#def-pencil-a" transform="translate(-1185 -9800)"/></symbol>
<symbol id="icon-phone" viewBox="0 0 21 22"><use xlink:href="#def-phone-a" transform="translate(-716 -19)"/></symbol>
<symbol id="icon-play-circle" viewBox="0 0 24 24"><path d="M12 24a12 12 0 110-24 12 12 0 010 24zM2 12a10 10 0 1020 0 10 10 0 00-20 0z"/><path d="M11.01 14.52c-.05.28.1.55.35.67.25.13.55.07.74-.14l2.85-2.94c.26-.27.27-.7.02-.98l-2.83-2.94a.69.69 0 00-.75-.13.67.67 0 00-.38.65z"/></symbol>
<symbol id="icon-play-reviews" viewBox="0 0 9 9"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.074 4.507c0 .41-.745.741-.745.741l-5.854 2.91a.619.619 0 01-.563-.054.649.649 0 01-.294-.494V1.392A.586.586 0 01.895.853a.557.557 0 01.595.01l5.839 2.903s.745.331.745.741z"/></symbol>
<symbol id="icon-play" viewBox="0 0 17 17"><path d="M17 9.02c0 .88-1.6 1.59-1.6 1.59L2.84 16.86c-.4.16-.84.12-1.21-.12A1.4 1.4 0 011 15.68V2.33c-.03-.47.2-.92.6-1.16.39-.24.89-.23 1.27.02L15.4 7.43s1.6.71 1.6 1.59z"/></symbol>
<symbol id="icon-plus-zoom" viewBox="0 0 24 24"><path d="M23 13H13v10a1 1 0 01-1 1 1 1 0 01-1-1V13H1a1 1 0 01-1-1 1 1 0 011-1h10V1a1 1 0 011-1 1 1 0 011 1v10h10a1 1 0 011 1 1 1 0 01-1 1z"/></symbol>
<symbol id="icon-plus" viewBox="0 0 16 16"><use xlink:href="#def-plus-a" transform="translate(-1208 -4164)"/></symbol>
<symbol id="icon-search" viewBox="0 0 22 22"><use xlink:href="#def-search-a" transform="translate(-1083 -22)"/></symbol>
<symbol id="icon-shape" viewBox="0 0 48 38"><use xlink:href="#def-shape-a" transform="translate(-832 -13296)"/></symbol>
<symbol id="icon-share" viewBox="0 0 26 24"><path d="M21.03 8a3.95 3.95 0 01-3.02-1.41l-9.08 4.54c.12.55.13 1.11.02 1.66l9.06 4.61a3.98 3.98 0 11-.9 1.79l-9.05-4.61a4 4 0 11-.05-5.22l9.1-4.55A4 4 0 1121.03 8zm0 14a2 2 0 002-2 2 2 0 10-2 2zm-18-10a2 2 0 104 0 2 2 0 00-4 0zm16-8a2 2 0 104 0 2 2 0 00-4 0z"/></symbol>
<symbol id="icon-smile" viewBox="0 0 23 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.5 23.278c-6.351 0-11.5-5.148-11.5-11.5C0 5.427 5.149.278 11.5.278S23 5.427 23 11.778c-.005 6.35-5.15 11.495-11.5 11.5zm0-21.083a9.583 9.583 0 00-9.583 9.583 9.584 9.584 0 1019.167 0A9.599 9.599 0 0011.5 2.195zm-6.613 12.87a7.38 7.38 0 006.613 4.38 7.333 7.333 0 006.613-4.38.957.957 0 00-.93-1.427.96.96 0 00-.796.603 5.277 5.277 0 01-9.774 0 .959.959 0 00-1.726.824zm10.447-3.287a1.917 1.917 0 110-3.833 1.917 1.917 0 010 3.833zM5.75 9.862a1.917 1.917 0 103.833 0 1.917 1.917 0 00-3.833 0z"/></symbol>
<symbol id="icon-socials" viewBox="0 0 40 40"><g fill-rule="evenodd"><circle cx="20" cy="20" r="20"/><path d="M20.021 31h-.485C13.717 31 9 26.08 9 20.009c0-6.07 4.717-10.991 10.536-10.991.309-.024.619-.024.928 0 5.819 0 10.536 4.92 10.536 10.99C31 26.08 26.283 31 20.464 31h-.443zm0-2.198h.316c4.655 0 8.43-3.937 8.43-8.793s-3.775-8.793-8.43-8.793h-.632c-4.655 0-8.43 3.937-8.43 8.793s3.775 8.793 8.43 8.793h.316z"/><path d="M19.382 31C13.648 31 9 26.08 9 20.009c0-6.07 4.648-10.991 10.382-10.991.305-.024.61-.024.914 0 .252.02.488.138.665.33 5.385 5.95 5.385 15.338 0 21.29a.998.998 0 01-1.142.252.992.992 0 01-.437.11zm.322-19.784h-.238c-4.588 0-8.306 3.937-8.306 8.793s3.718 8.793 8.306 8.793a.981.981 0 01.26 0c4.23-5.007 4.23-12.58 0-17.586h-.022z" clip-rule="evenodd"/><path d="M19.91 30.967a1.101 1.101 0 01-.419-.077 1.101 1.101 0 01-1.21-.253c-5.708-5.95-5.708-15.337 0-21.288a1.1 1.1 0 01.704-.33 6.664 6.664 0 011.012 0C26.074 9.02 31 13.94 31 20.01S26.074 31 19.997 31l-.088-.033zm-.353-19.783a13.177 13.177 0 000 17.585c.091-.012.184-.012.275 0 4.861 0 8.802-3.936 8.802-8.792s-3.94-8.793-8.802-8.793h-.275z" clip-rule="evenodd"/><path d="M27.944 17H11.056C10.473 17 10 16.552 10 16s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1zM27.944 25H11.056C10.473 25 10 24.552 10 24s.473-1 1.056-1h16.888c.583 0 1.056.448 1.056 1s-.473 1-1.056 1z"/></g></symbol>
<symbol id="icon-strawberry" viewBox="0 0 49 48"><use xlink:href="#def-strawberry-a" transform="translate(-832 -13406)"/></symbol>
<symbol id="icon-telegram" viewBox="0 0 29 24"><use xlink:href="#def-telegram-a" transform="translate(-795 -271)"/></symbol>
<symbol id="icon-telegram2-mob" viewBox="0 0 34 34"><path d="M14.95 19.329l-.25 3.528c.358 0 .514-.154.7-.34l1.683-1.607 3.486 2.553c.64.356 1.09.168 1.263-.588L24.12 12.15c.204-.946-.341-1.316-.964-1.084l-13.452 5.15c-.918.357-.904.869-.156 1.1l3.44 1.07 7.988-4.998c.375-.25.717-.112.436.137L14.95 19.33z"/></symbol>
<symbol id="icon-telegram2" viewBox="0 0 56 56"><path d="M25.848 30.985l-.331 4.653c.473 0 .678-.203.924-.447l2.22-2.121 4.598 3.367c.843.47 1.437.223 1.665-.776l3.018-14.143.001-.001c.268-1.247-.45-1.734-1.272-1.428L18.929 26.88c-1.211.47-1.193 1.145-.206 1.451l4.536 1.411 10.536-6.593c.495-.328.946-.146.575.182l-8.522 7.653z"/></symbol>
<symbol id="icon-tm" viewBox="0 0 26 22"><use xlink:href="#def-tm-a" transform="translate(-1399 -334)"/></symbol>
<symbol id="icon-trash" viewBox="0 0 20 21"><use xlink:href="#def-trash-a" transform="translate(-1156 -9799)"/></symbol>
<symbol id="icon-triangle" viewBox="0 0 16 8"><use xlink:href="#def-triangle-a" transform="translate(-1237 -6883)"/></symbol>
<symbol id="icon-tw" viewBox="0 0 18 15"><path d="M18 1.75c-.66.3-1.37.5-2.12.59A3.7 3.7 0 0017.5.27c-.71.43-1.5.74-2.34.91a3.68 3.68 0 00-6.39 2.56c0 .3.03.58.09.85A10.45 10.45 0 011.25.69 3.75 3.75 0 002.4 5.68a3.67 3.67 0 01-1.68-.47v.05a3.75 3.75 0 002.97 3.67 3.51 3.51 0 01-1.67.06 3.7 3.7 0 003.45 2.6A7.33 7.33 0 010 13.14a10.37 10.37 0 005.66 1.68c6.79 0 10.51-5.7 10.51-10.64l-.01-.49A7.35 7.35 0 0018 1.76z"/></symbol>
<symbol id="icon-twitter-mob" viewBox="0 0 34 34"><path d="M24.406 12.386a6.16 6.16 0 01-1.702.466 2.937 2.937 0 001.3-1.632c-.572.34-1.202.58-1.873.715a2.952 2.952 0 00-5.109 2.02c0 .233.02.458.068.672a8.36 8.36 0 01-6.087-3.089 2.957 2.957 0 00.908 3.947 2.917 2.917 0 01-1.335-.363v.032a2.967 2.967 0 002.366 2.902c-.24.066-.502.097-.774.097-.189 0-.38-.01-.56-.05a2.981 2.981 0 002.76 2.057 5.934 5.934 0 01-3.661 1.26c-.242 0-.475-.011-.707-.04a8.314 8.314 0 004.53 1.325c5.435 0 8.406-4.502 8.406-8.404 0-.13-.004-.257-.01-.382a5.89 5.89 0 001.48-1.533z"/></symbol>
<symbol id="icon-twitter" viewBox="0 0 56 56"><path d="M38 21.828c-.707.31-1.46.515-2.244.615a3.874 3.874 0 001.713-2.153 7.783 7.783 0 01-2.47.943 3.894 3.894 0 00-6.738 2.664c0 .308.026.605.09.887a11.025 11.025 0 01-8.028-4.074 3.922 3.922 0 00-.533 1.969 3.9 3.9 0 001.73 3.237 3.847 3.847 0 01-1.76-.48v.043a3.913 3.913 0 003.12 3.827 3.887 3.887 0 01-1.02.129c-.25 0-.502-.015-.738-.067.505 1.543 1.937 2.677 3.64 2.714a7.827 7.827 0 01-4.83 1.66c-.32 0-.626-.013-.932-.052a10.966 10.966 0 005.976 1.748c7.167 0 11.086-5.938 11.086-11.085a9.95 9.95 0 00-.014-.503A7.77 7.77 0 0038 21.828z"/></symbol>
<symbol id="icon-user-circle" viewBox="0 0 24 24"><use xlink:href="#def-user-circle-a" transform="translate(-1244 -22)"/></symbol>
<symbol id="icon-vb" viewBox="0 0 25 27"><use xlink:href="#def-vb-a" transform="translate(-931 -270)"/></symbol>
<symbol id="icon-view-list" viewBox="0 0 15 15"><path d="M0 6V0h15v6zm0 9V9h15v6z"/></symbol>
<symbol id="icon-view-tile" viewBox="0 0 15 15"><path d="M0 6V0h6v6zm9 0V0h6v6zm0 9V9h6v6zm-9 0V9h6v6z"/></symbol>
<symbol id="icon-vk" viewBox="0 0 22 14"><path d="M10.61 13.8h1.3s.39-.04.59-.27c.19-.2.18-.59.18-.59s-.02-1.8.78-2.07c.8-.26 1.82 1.75 2.91 2.52.81.58 1.44.46 1.44.46l2.89-.05s1.52-.09.8-1.33c-.06-.1-.42-.92-2.15-2.59-1.82-1.75-1.58-1.47.61-4.5 1.33-1.84 1.87-2.97 1.7-3.45-.16-.46-1.14-.34-1.14-.34l-3.26.02s-.24-.03-.42.08-.29.36-.29.36-.52 1.43-1.2 2.64c-1.46 2.57-2.04 2.7-2.27 2.54-.56-.37-.42-1.49-.42-2.28 0-2.49.36-3.52-.71-3.79A5.26 5.26 0 0010.43 1c-1.16-.01-2.15.01-2.7.29-.38.19-.66.61-.49.63.22.03.71.14.97.51.33.47.32 1.53.32 1.53s.19 2.92-.45 3.29c-.44.25-1.04-.26-2.34-2.59-.66-1.19-1.16-2.5-1.16-2.5s-.1-.25-.27-.38c-.21-.16-.5-.21-.5-.21l-3.1.02s-.47.01-.64.22c-.15.19-.01.58-.01.58s2.43 5.89 5.17 8.87c2.52 2.72 5.38 2.54 5.38 2.54z"/></symbol>
<symbol id="icon-vk2-mob" viewBox="0 0 34 34"><path fill-rule="evenodd" clip-rule="evenodd" d="M16.79 21.913h.947a.77.77 0 00.436-.201.795.795 0 00.13-.459s-.016-1.399.573-1.608c.588-.209 1.336 1.351 2.13 1.954.297.259.68.383 1.063.346l2.123-.032s1.116-.073.589-1.03a7.642 7.642 0 00-1.582-2.002c-1.337-1.35-1.153-1.134.451-3.473.978-1.424 1.367-2.3 1.245-2.67a.866.866 0 00-.832-.257l-2.4.016a.463.463 0 00-.305.056.702.702 0 00-.214.282 15.134 15.134 0 01-.886 2.042c-1.062 1.978-1.49 2.082-1.665 1.962-.405-.29-.306-1.15-.306-1.77 0-1.913.268-2.717-.511-2.926a4.053 4.053 0 00-1.123-.12 4.804 4.804 0 00-1.987.225c-.275.144-.48.466-.351.49.273.03.524.167.703.386.165.37.246.774.237 1.182 0 0 .145 2.26-.329 2.54-.32.194-.764-.2-1.719-1.993a17.581 17.581 0 01-.848-1.938.803.803 0 00-.198-.29.84.84 0 00-.367-.16l-2.276.016a.723.723 0 00-.466.169.581.581 0 00-.016.442s1.788 4.559 3.805 6.859c.99 1.217 2.427 1.931 3.95 1.962z"/></symbol>
<symbol id="icon-vk2" viewBox="0 0 56 56"><path fill-rule="evenodd" clip-rule="evenodd" d="M28.274 34.074h1.25c.213-.024.413-.117.574-.265.117-.177.177-.39.172-.605 0 0-.02-1.845.755-2.12.776-.276 1.763 1.78 2.811 2.576.391.342.895.506 1.4.456l2.802-.042s1.47-.096.775-1.358a10.079 10.079 0 00-2.085-2.64c-1.763-1.782-1.522-1.495.594-4.582 1.29-1.877 1.804-3.033 1.642-3.52a1.143 1.143 0 00-1.098-.34l-3.163.021a.61.61 0 00-.403.075.925.925 0 00-.282.37 19.972 19.972 0 01-1.17 2.694c-1.4 2.61-1.964 2.747-2.196 2.588-.534-.382-.403-1.516-.403-2.333 0-2.524.353-3.584-.675-3.86a5.345 5.345 0 00-1.48-.16 6.336 6.336 0 00-2.62.298c-.363.19-.635.615-.464.646.36.039.691.221.927.51.218.487.325 1.02.312 1.558 0 0 .192 2.98-.433 3.352-.423.254-1.007-.265-2.267-2.63a23.184 23.184 0 01-1.118-2.556 1.06 1.06 0 00-.262-.382 1.109 1.109 0 00-.484-.212l-3.002.021a.953.953 0 00-.615.223.767.767 0 00-.02.583s2.358 6.013 5.018 9.046c1.305 1.606 3.2 2.548 5.209 2.588z"/></symbol>
<symbol id="icon-yandex" viewBox="0 0 5 11"><path d="M4.847 0H3.259C1.7 0 .376 1.169.376 3.438c0 1.36.64 2.364 1.783 2.86L.028 10.092c-.07.123 0 .22.111.22h.99c.083 0 .139-.028.166-.097L3.231 6.49h.697v3.726c0 .041.041.097.097.097h.864c.083 0 .111-.042.111-.11V.138C5 .04 4.944 0 4.847 0zm-.92 5.61h-.584c-.92 0-1.81-.66-1.81-2.31 0-1.719.835-2.42 1.684-2.42h.71v4.73z" fill-rule="nonzero"/></symbol>
<symbol id="icon-ynadex" viewBox="0 0 5 10"><use xlink:href="#def-ynadex-a" transform="translate(-468 -10321)"/></symbol>
<symbol id="icon-ytube" viewBox="0 0 27 20"><use xlink:href="#def-ytube-a" transform="translate(-1332 -335)"/></symbol>
</svg>
<div class="header-banner topBanner" data-type="header" style="display: block; position: sticky; top: 0; z-index: 999;">
<a data-source="213325" data-banner="226288" class="universal-notice js-universal-notice-notice universal-notice--webp universal-notice--bitrix universal-notice--active" href="https://skillbox.ru/sale/main/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_banners_header_all_all_skillbox" target="_blank" style="--banner-bg: #5927E9;--banner-color: #fff;--button-font-color: #000000;--button-bg-color: #FFFFFF;--banner-img-left: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.png);--banner-img-left-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_left/602754/f9ac17dd-a1d4-46c6-aa14-4f7b949defd1.webp);--banner-img-center: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-center-mobile: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.png);--banner-img-center-mobile-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_center/602507/232fc4a5-b130-4af2-a629-bdb293a4dd2e.webp);--banner-img-right: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.png);--banner-img-right-webp: url(https://cdn.skillbox.pro/mainsite/banners/promo_picture_right/602755/ad7a7fe5-b8d3-47a3-885b-51a7971c12a9.webp);">
<span class="universal-notice__wrapper">
<b class="universal-notice__title">
Скидка до 55% и 3 курса в подарок
</b>
<span class="universal-timer js-universal-notice-timer js-universal-notice-active">
<span class="universal-timer__days js-universal-notice-days">2 дня</span>
<span class="js-universal-notice-hours">13</span>
:<span class="js-universal-notice-minutes">30</span>
:<span class="js-universal-notice-seconds">09</span>
</span>
<span class="universal-notice__button">Выбрать курс</span>
</span>
</a><script>
document.addEventListener('DOMContentLoaded', () => {
// Установите конечную дату
const deadline = new Date();
deadline.setDate(5);
deadline.setHours(0, 0, 0);
// Найдите элементы DOM
var timer = document.querySelector('.universal-timer');
const elDays = timer.querySelector('.js-universal-notice-days');
const elHours = timer.querySelector('.js-universal-notice-hours');
const elMinutes = timer.querySelector('.js-universal-notice-minutes');
const elSeconds = timer.querySelector('.js-universal-notice-seconds');
// Функция обновления таймера
const updateTimer = () => {
const now = new Date();
let diff = Math.max(0, deadline - now);
if (diff === 0) {
let lastDayOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
let lastDay = lastDayOfMonth.getDate();
if (lastDay - now.getDate() < 4) {
deadline.setMonth(deadline.getMonth() + 1, 1);
} else {
deadline.setDate(deadline.getDate() + 4);
}
diff = Math.max(0, deadline - now);
}
// Time calculations for days, hours, minutes and seconds
var days = Math.floor(diff / (1000 * 60 * 60 * 24));
var hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)).toString();
var minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)).toString();
var seconds = Math.floor((diff % (1000 * 60)) / 1000).toString();
if (timer) {
let dayTitles = ['день', 'дня', 'дней'];
let daySuffix = dayTitles[(days % 100 > 4 && days % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][days % 10 < 5 ? days % 10 : 5]]
elDays.innerHTML = days + ' ' + daySuffix;
elHours.innerHTML = hours.padStart(2, '0');
elMinutes.innerHTML = minutes.padStart(2, '0');
elSeconds.innerHTML = seconds.padStart(2, '0');
}
};
updateTimer();
const timerId = setInterval(updateTimer, 1000);
});
</script>
<style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{position:sticky;z-index:5;top:0;box-sizing:border-box;text-decoration:none;display:none;justify-content:space-between;overflow:hidden;color:var(--banner-color);background-color:var(--banner-bg);font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transition:opacity .25s ease-in-out}.universal-notice--active{display:flex}.universal-notice--bitrix{z-index:1000}.universal-notice *,.universal-notice ::after,.universal-notice ::before{box-sizing:inherit}.universal-notice::after,.universal-notice::before{display:none;width:194px;height:56px;content:"";background-size:194px 56px;background-repeat:no-repeat}.universal-notice--no-webp::before{background-image:var(--banner-img-left)}.universal-notice--no-webp::after{background-image:var(--banner-img-right)}.universal-notice--webp::before{background-image:var(--banner-img-left-webp)}.universal-notice--webp::after{background-image:var(--banner-img-right-webp)}.universal-notice--new-design{position:static;margin:4px;border-radius:16px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:166px;height:48px;background-size:166px 48px}.universal-notice__wrapper{display:grid;grid-template-columns:1fr auto;align-items:center;grid-gap:12px;padding:12px;width:100%}.universal-notice--new-design .universal-notice__wrapper::after{height:48px}.universal-notice__title{font-weight:500;font-size:15px;line-height:16px}.universal-notice--new-design .universal-notice__title{font-size:14px;line-height:15px}.universal-timer{display:none;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;font-weight:500;font-size:24px;line-height:26px}.universal-notice--new-design .universal-timer{font-size:22px;line-height:24px}.universal-timer__days{margin-right:8px}.universal-notice__button{grid-column:2/3;padding:6px 16px;border-radius:6px;color:var(--button-font-color);background-color:var(--button-bg-color);font-weight:500;font-size:14px;line-height:20px}.universal-notice-sticky{position:fixed;z-index:5;top:0;left:0;width:100%;padding:11px 8px;color:var(--banner-color);background-color:var(--banner-bg);text-align:center;transition:transform .3s ease-in-out;will-change:transform;transform:translateY(-200%)}.universal-notice-sticky--show{transform:translateY(0)}@media (min-width:360px) and (max-width:0px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:360px){.universal-notice__wrapper{padding:0 12px;grid-template-columns:1fr 56px auto}.universal-notice__wrapper::after{grid-column:2/3;grid-row:1/2;width:100%;height:56px;background-size:cover;background-repeat:no-repeat;content:""}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 48px auto}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-mobile-webp)}.universal-notice__button{grid-column:3/4}}@media (min-width:768px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:768px) and (max-width:0px){.universal-notice::before{background-position:right center;flex-shrink:0;display:block}.universal-notice--no-webp .universal-notice__wrapper::after{background-image:var(--banner-img-center)}.universal-notice--webp .universal-notice__wrapper::after{background-image:var(--banner-img-center-webp)}}@media (min-width:1024px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1024px) and (max-width:0px){.universal-notice::after,.universal-notice::before{width:250px;height:72px;background-size:250px 72px}.universal-notice--new-design{height:64px;border-radius:32px}.universal-notice--new-design::after,.universal-notice--new-design::before{width:226px;height:64px;background-size:226px 64px}.universal-notice__wrapper{grid-template-columns:1fr 72px auto;grid-gap:24px;padding-right:16px;padding-left:24px}.universal-notice__wrapper::after{height:72px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px auto}.universal-notice--new-design .universal-notice__wrapper::after{height:64px}.universal-notice__title{font-size:24px;line-height:26px}.universal-notice--new-design .universal-notice__title{font-size:22px;line-height:24px}.universal-notice__button{padding:10px 24px;border-radius:8px}.universal-notice-sticky{padding:14px 24px}}@media (min-width:1280px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1280px) and (max-width:0px){.universal-notice::before{flex-shrink:1}.universal-notice::after{background-position:left center;display:block}.universal-notice__wrapper{grid-template-columns:1fr 72px minmax(202px,auto) auto;min-width:940px;max-width:1020px;padding-right:24px}.universal-notice--new-design .universal-notice__wrapper{grid-template-columns:1fr 64px minmax(202px,auto) auto}.universal-timer.js-universal-notice-active{display:flex}.universal-notice__timer-nuxt{display:flex}.universal-notice__button{grid-column:4/5}}@media (min-width:1400px) and (max-width:0px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}@media (min-width:1400px){.universal-notice::before{flex-shrink:0}.universal-notice::after{flex-shrink:0}}</style> </div>
<script>
document.addEventListener("DOMContentLoaded", function(event) {
window.TopBanner = true;
});
$(document).ready(function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-show',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
});
$(document).on('click', '.header-banner', function () {
$.ajax({
url: '/local/ajax/advert.php',
type: 'POST',
data: {
'type': 'top-banner-click',
'id': 226288,
'section_id': 0,
},
success: function (result) {
}
});
var page = window.location;
var $article = $('section[data-article-text]');
var pageId = $article.data('articleid');
if(pageId === undefined)
{
pageId = 0;
}
window.dataLayer.push({
'event': 'go_to_course',
'courseID': 226288,
'page': page,
'pageID': pageId
});
});
</script>
<header class="header">
<div id="menu" class="header__wrapper container">
<div class="header__logo link-active">
<a href="/media/" class="header__media-main-link">
<img src="/local/templates/media/images/logo/skillbox-media.svg" alt="Skillbox"/>
</a>
<a href="/media/code/" class="header__media-category-link">
<span class="header__media-category js-category ">Код</span>
</a>
</div>
<a href="/media/about-media/" v-if="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link--about" target="_blank" style="display: none">
Про медиа
</a>
<button v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="toggle-menu header__toggle toggle-menu--course"
@click="openCourseMenu()"
:class="{ 'toggle-menu--active': isOpenCourseMenu }"
style="display: none">
Онлайн-курсы
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg"
:class="{
'animated-chevron--default': isOpenCourseMenu,
'animated-chevron--active animated-chevron--default': ! isOpenCourseMenu
}"
class="animated-chevron toggle-menu__arrow select-arrow select-arrow--small">
<line x1="6.48415" y1="5.92242" x2="11.4909" y2="10.9291" stroke="currentColor" stroke-width="1.78"
class=" animated-chevron__line animated-chevron__line1 animated-chevron__line1--default"></line>
<line x1="6.3701" y1="5.9224" x2="11.3768" y2="0.915678" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
<line x1="1.36337" y1="10.9291" x2="6.3701" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line animated-chevron__line2 animated-chevron__line2--default"></line>
<line x1="1.47743" y1="0.915681" x2="6.48415" y2="5.9224" stroke="currentColor" stroke-width="1.78"
class="animated-chevron__line"></line>
</svg>
</button>
<a href="https://skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=button_main_skillbox&utm_term=mainskillbox" v-if="!isMobile" v-show="!isMobile" rel="nofollow" class="menu-nav__link menu-nav__link-ml0 menu-nav__link--main" target="_blank" style="display: none">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<div v-if="isOpenCourseMenu && !isMobile" class="menu-block menu-block--desktop" @click="closeCourseMenu($event)" style="display: none">
<div class="menu-block__wrapper menu-block__wrapper--desktop">
<div class="menu-block__content vue-container">
<span class="menu-block__title">
Направления обучения
</span>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/?utm_source=media&utm_medium=button&utm_campaign=button_courses_all&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/?utm_source=media&utm_medium=button&utm_campaign=button_courses_code&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/?utm_source=media&utm_medium=button&utm_campaign=button_courses_design&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management?utm_source=media&utm_medium=button&utm_campaign=button_courses_management&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing?utm_source=media&utm_medium=button&utm_campaign=button_courses_marketing&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games?utm_source=media&utm_medium=button&utm_campaign=button_courses_games&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia?utm_source=media&utm_medium=button&utm_campaign=button_courses_multimedia&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Кино и Музыка
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology?utm_source=media&utm_medium=button&utm_campaign=button_courses_psychology&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/health?utm_source=media&utm_medium=button&utm_campaign=button_courses_health&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Здоровье
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/spo/?utm_source=media&utm_medium=button&utm_campaign=button_courses_spo&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Цифровой колледж
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/?utm_source=media&utm_medium=button&utm_campaign=button_courses_general-development&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/?utm_source=media&utm_medium=button&utm_campaign=button_courses_engineering&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/?utm_source=media&utm_medium=button&utm_campaign=button_courses_english&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/?utm_source=media&utm_medium=button&utm_campaign=button_courses_other&utm_term=button" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
</div>
</div>
</div>
<div v-show="isOpenMenu" class="menu-block" @click="closeMenu($event)" style="display: none">
<div class="menu-block__wrapper">
<div class="menu-block__content vue-container">
<h2 class="menu-block__header">Редакции</h2>
<div class="tab-nav" data-tab-parent="" data-action="index">
<div class="tab-nav__item">
<a class="" data-tab-name="media_nav" data-section-id="0" data-code="All directions" href="/media/">
<img src="/local/templates/media/images/common/menu-icon-mobile-1.png" alt=""/>
Все
</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/history/">
<img src="/local/templates/media/images/common/menu-icon-mobile-19.png"
alt=""/>
Истории</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="8"
data-code="Design"
href="/media/design/">
<img src="/local/templates/media/images/common/menu-icon-mobile-2.png" alt=""/>
Дизайн</a>
</div>
<div class="tab-nav__item">
<a class="tab-active"
data-tab-name="media_nav"
data-section-id="10"
data-code="Code"
href="/media/code/">
<img src="/local/templates/media/images/common/menu-icon-mobile-3.png" alt=""/>
Код</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="18"
data-code="GameDev"
href="/media/gamedev/">
<img src="/local/templates/media/images/common/menu-icon-mobile-4.png" alt=""/>
Геймдев</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="21"
data-code="Business"
href="/media/business/">
<img src="/local/templates/media/images/common/menu-icon-mobile-9.png" alt=""/>
Бизнес</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="9"
data-code="Marketing"
href="/media/marketing/">
<img src="/local/templates/media/images/common/menu-icon-mobile-5.png" alt=""/>
Маркетинг</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="11"
data-code=""
href="/media/management/">
<img src="/local/templates/media/images/common/menu-icon-mobile-6.png" alt=""/>
Управление</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="29"
data-code=""
href="/media/cinemusic/">
<img src="/local/templates/media/images/common/menu-icon-mobile-22.png" alt=""/>
Кино</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="36"
data-code=""
href="/media/music/">
<img src="/local/templates/media/images/common/menu-icon-mobile-23.png" alt=""/>
Музыка</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="34"
data-code=""
href="/media/photo/">
<img src="/local/templates/media/images/common/menu-icon-mobile-20.png" alt=""/>
Проектная фотография</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="17"
data-code="Development"
href="/media/growth/">
<img src="/local/templates/media/images/common/menu-icon-mobile-7.png" alt=""/>
Развитие</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="33"
data-code=""
href="/media/health/">
<img src="/local/templates/media/images/common/menu-icon-mobile-16.png" alt=""/>
Здоровье</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="32"
data-code=""
href="/media/money/">
<img src="/local/templates/media/images/common/menu-icon-mobile-17.png" alt=""/>
Деньги</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="22"
data-code="Education"
href="/media/education/">
<img src="/local/templates/media/images/common/menu-icon-mobile-8.png" alt=""/>
Образование</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="31"
data-code=""
href="/media/edtech/">
<img src="/local/templates/media/images/common/menu-icon-mobile-11.png" alt=""/>
EdTech</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="30"
data-code=""
href="/media/corptrain/">
<img src="/local/templates/media/images/common/menu-icon-mobile-10.png" alt=""/>
Корп. обучение</a>
</div>
<div class="tab-nav__item">
<a class=""
data-tab-name="media_nav"
data-section-id="35"
data-code=""
href="/media/skillbox-blog/">
<img src="/local/templates/media/images/common/menu-icon-mobile-21.png" alt=""/>
Блог Skillbox</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/media/glossary/">
<img src="/local/templates/media/images/common/menu-icon-mobile-18.png"
alt=""/>
Глоссарий</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="/media/topic/specials/">
<img src="/local/templates/media/images/common/menu-icon-mobile-13.png"
alt=""/>
Спецпроекты</a>
</div>
<div class="tab-nav__item tab-nav__item--custom tab-nav__item--spec"
data-nav-parent-item>
<a
data-tab-name="media_nav"
data-code=""
href="https://skillbox.ru/course/career-guide-free/">
<img src="/local/templates/media/images/common/menu-icon-mobile-15.png"
alt=""/>
Профориентация</a>
</div>
</div>
<h2 class="menu-block__header">Онлайн-курсы</h2>
<ul class="menu-directions menu-block__direction">
<li class="menu-directions__item">
<a href="https://skillbox.ru/courses/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="All directions">
Все направления
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/code/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Code">
Программирование
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/design/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Design">
Дизайн
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/marketing/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Marketing">
Маркетинг
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/management/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Management">
Управление
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/games/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="GameDev">
Игры
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/multimedia/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="">
Мультимедиа
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/psychology/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Development">
Психология
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/general-development/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Education">
Общее развитие
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/engineering/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="engineering">
Инженерия
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/english/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="english">
Английский язык
</a>
</li>
<li class="menu-directions__item">
<a href="https://skillbox.ru/other/" target="_blank"
class="ui-tab ui-tab--link menu-directions__tab ui-tab--small"
data-code="Other">
Другое
</a>
</li>
</ul>
<a href="/media/about-media/" rel="nofollow" class="menu-nav__link">
Про медиа
</a>
<a href="https://skillbox.ru/" rel="nofollow" class="menu-nav__link">
Главная Skillbox
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M3.9375 10.0618L9.9161 4.08203" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M3.93811 3.93665H10.0631V10.0616" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</div>
</div>
</div>
<button v-if="isMobile" class="menu-toggle"
@click="openMenu()"
:class="{ 'menu-toggle--opened': isOpenMenu }" style="opacity: 0">
<span v-if="isOpenMenu" class="menu-toggle__line"></span>
<svg v-if="!isOpenMenu" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 5.5H0V4H24V5.5ZM24 11.5H0V13H24V11.5ZM24 19H0V20.5H24V19Z" fill="black"/>
</svg>
</button>
</div>
<script>
BX.Vue.create({
el: '#menu',
data: {
isOpenMenu: false,
isOpenCourseMenu: false,
isMobile: false,
isSubOpen: false,
display: 'none'
},
computed: {
isMobile() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
return w < 1024;
}
},
methods: {
openMenu() {
this.isOpenMenu = !this.isOpenMenu;
document.getElementsByTagName('body')[0].classList.toggle('scroll-locked');
window.addEventListener('keyup', this.closeMenu);
},
closeMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeMenu);
}
},
openCourseMenu() {
this.isOpenCourseMenu = !this.isOpenCourseMenu;
if (this.isOpenCourseMenu) {
document.getElementsByTagName('body')[0].classList.add('scroll-locked');
window.addEventListener('keyup', this.closeCourseMenu);
} else {
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
closeCourseMenu(event) {
if (event.target.classList.contains('menu-block') || event.keyCode === 27) {
this.isOpenCourseMenu = false;
document.getElementsByTagName('body')[0].classList.remove('scroll-locked');
window.removeEventListener('keyup', this.closeCourseMenu);
}
},
openSub() {
this.isSubOpen = !this.isSubOpen;
},
isMobileFn() {
const w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;
this.isMobile = (w < 1024);
}
},
created() {
window.addEventListener("resize", this.isMobileFn);
document.querySelector('.menu-block').style.display = '';
document.querySelector('.menu-toggle').style.opacity = '1';
document.querySelector('.menu-nav__link').style.display = '';
this.display = 'block';
this.isMobileFn();
},
destroyed() {
window.removeEventListener("resize", this.isMobileFn);
}
});
</script>
</header>
<main class="content">
<div class="page style-update">
<div class="page-wrap">
<style>
.article-inner .rr-widget__title {
padding-top: 0 !important;
}
.article-inner div[data-retailrocket-markup-block] {
margin-top: -32px;
display: none;
}
.article-inner {
font-family: 'Graphik';
}
</style>
<div class="under_header_banner" data-type="under_header"><!-- Yandex.RTB R-A-13443663-10 -->
<div id="yandex_rtb_R-A-13443663-10"></div>
<script>
window.yaContextCb.push(() => {
Ya.Context.AdvManager.render({
"blockId": "R-A-13443663-10",
"renderTo": "yandex_rtb_R-A-13443663-10"
})
})
</script>
</div> <div data-area="article" data-title="Регулярные выражения в Python: подробная инструкция по применению / Skillbox Media" class=" noFullClass">
<div class="article-inner">
<section class="top-section-detail-page ">
<div class="container">
<div class="article-preview-info">
<div class="article-preview-info__tags ">
<div class="tag article-preview-info__tag">
<a href="/media/code/"
class="tag-item programming">
Код </a>
</div>
</div>
<a class="info-hashtag article-preview-info__hashtag" href="/media/topic/articles/">
#статьи </a>
<ul class="info article-preview__info-box">
<li class="info-item"> <time class="info-text" datatime="#">5 окт 2022</time></li>
<li class="info-item hidden">
<span class="info-icon"><img src="/local/templates/media/images/icons/like.svg" alt=""></span>
<span class="info__text js-article-like-value">0</span>
</li>
</ul>
</div>
<div class="row">
<div class="top-section-detail-page__title-block col-xl-9 col-lg-10">
<div class="article-preview">
<h1 class="article-preview__title">Регулярные выражения в Python: синтаксис, полезные функции и задачи</h1>
<p class="article-preview__description">Исчерпывающий гайд по работе с мощным инструментом для анализа и обработки строк.</p>
</div>
</div>
</div>
</div>
</section>
<section data-article-text
data-articleId="213325"
data-courseId="3240"
>
<div class="container">
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div> <!-- //share -->
</noindex>
<div class="row">
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-poster">
<picture >
<img src="https://248006.selcdn.ru/main/iblock/3fa/3fa8b5d0b74b6c99f433e9543d14ae47/dcee45b6257d843781f37d3e32435bdb.png" itemprop='image' class='hidden-xs' />
</picture> <picture >
<img src="https://248006.selcdn.ru/main/iblock/3fa/3fa8b5d0b74b6c99f433e9543d14ae47/dcee45b6257d843781f37d3e32435bdb.png" itemprop='image' class='visible-xs' />
</picture> </div>
<noindex>
<p class="article-poster-text" data-nosnippet>
Иллюстрация: Оля Ежак для SKillbox Media </p>
</noindex>
</div>
<div class="col-xl-3 col-lg-4 col-author">
<div class="article-author">
<div class="article-author__image">
<a href="/media/authors/ivan-stukov/">
<img src="https://248006.selcdn.ru/main/iblock/21f/21f8018277c1114d7588b835e0fcf252/728b37f2104e5ef07b2f8b3f7448db0a.png" alt="Иван Стуков">
</a>
</div>
<div class="article-author__info">
<div class="article-author__name">
Иван Стуков </div>
<div class="article-author__description">
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их. </div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row flex-row-rev">
<div class="col-xl-3 col-lg-4 col-author">
<div class="js-article-banner" data-article-banner-mobile data-type="side_mounted" data-article-banner-sticky-start>
<!--AdFox START-->
<!--yandex_skillbox.media-->
<!--Площадка: Skillbox / Сквозной для застройщика Легенда / Боковой баннер сквозной для застройщика Легенда-->
<!--Категория: <не задана>-->
<!--Тип баннера: Media banner-->
<div id="adfox_176131540100027244"></div>
<script>
window.yaContextCb.push(()=>{
Ya.adfoxCode.create({
ownerId: 11649869,
containerId: 'adfox_176131540100027244',
params: {
p1: 'dkugb',
p2: 'p'
}
})
})
</script> </div>
<div class="js-article-banner" data-article-banner-mobile data-type="vertical" data-article-banner-sticky-end></div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="container container--setka">
<div class="js-article-banner" data-type="top"></div>
<div class="article-detail-text__setka" data-detail-text>
<div class="stk-post stk-layout_12col_18068 stk-theme_26309" data-stk="{"images":[{"id":41802,"alt":"","caption":""},{"id":41801,"alt":"","caption":""},{"id":41803,"alt":"","caption":""},{"id":41800,"alt":"","caption":""}]}" data-ui-id="post" data-ce-tag="post" data-reset-type="class" data-layout-type="auto" data-editor-version="3.2.8-rc1"><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset" data-ce-tag="paragraph">Само словосочетание «регулярные выражения» звучит непонятно и выглядит страшно, но на самом деле ничего сложного в работе с ними нет. В этой статье мы познакомим вас с их логикой и основными принципами и научим разговаривать на языке шаблонов. В хорошем смысле слова.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Содержание:</strong></p><ul class="stk-theme_26309__pad_hor_1 stk-theme_26309__mb_05 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-1">Что такое регулярные выражения</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-2">Синтаксис регулярок</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-3">Как ведётся поиск</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-4">Квантификаторы и логическое ИЛИ при группировке</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-5">Регулярные выражения в Python: модуль re и Match-объекты</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-6">Жадный и ленивый пропуск</a></li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><a class="stk-reset" href="#stk-7">Примеры и задачи</a></li></ul><hr class="stk-theme_26309__separator_divider-1498128612642 stk-reset"/></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-1"><strong class="stk-reset">Что такое регулярные выражения</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Представьте, что вы снова в школе, на уроке истории. Вам нужно решить итоговую контрольную работу по всем датам, которые проходили в четверти.</p><p class="stk-reset" data-ce-tag="paragraph">Но тут вас поджидает препятствие: все даты разбросаны по нескольким главам учебника по десятку страниц каждая. Читать полкниги в поисках нужных вам крупиц информации — такое себе удовольствие. Тем более когда каждая минута на счету.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">К счастью, вы — человек неглупый (не зря же пошли в IT), тренированный и быстро соображающий. Поэтому моментально замечаете основные закономерности:</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item">даты обозначаются цифрами: арабскими, если это год и месяц, и римскими, если век;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item">учебник — по истории позднего Средневековья и Нового времени, поэтому все даты, написанные арабскими цифрами, — четырёхсимвольные;</li><li class="stk-reset stk-list-item" data-ce-tag="list-item">после римских цифр всегда идёт слово «век».</li></ul><p class="stk-reset" data-ce-tag="paragraph">Теперь у вас есть шаблон нужной информации. Остаётся лишь пролистать страницу за страницей и записать даты в смартфон (или себе на подкорку). Вуаля: пятёрка за четверть у вас в дневнике, а премия от родителей за отличную учёбу — в кармане.</p><p class="stk-reset" data-ce-tag="paragraph">По такому же принципу работают и регулярные выражения: они ведут поиск фрагментов текста по определённому шаблону. Если фрагмент совпадает с шаблоном — с ним можно работать.</p><p class="stk-reset" data-ce-tag="paragraph">Запишем логику поиска исторических дат в виде регулярных выражений (они ещё называются Regular Expressions, сокращённо regex или regexp). Выглядеть он будет так:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">(?:\d{<span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>})|(?:[IVX]+ век)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Приятные новости: regex — настолько полезный и мощный инструмент, что поддерживается почти всеми современными языками программирования, в том числе и Python. Причём соответствующий синтаксис в разных языках очень схож. Так что, выучив его в одном языке, можно пользоваться им в других, практически не переучиваясь. Поехали.</p></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-2"><strong class="stk-reset">Синтаксис регулярок</strong></h2><p class="stk-reset" data-ce-tag="paragraph">С помощью regex можно искать как вполне конкретные выражения (например, слово «век» — последовательность букв «в», «е» и «к»), так и что-то более общее (например, любую букву или цифру).</p><p class="stk-reset" data-ce-tag="paragraph">Для обозначения второй категории существуют специальные символы. Вот некоторые из них:</p><table data-responsive-type="cards" class="stk-table--zebra stk-reset stk-table" data-ce-tag="table"><colgroup><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stk44yur" data-stk-id="38"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkFk3r-" data-stk-id="39"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkU3cZj" data-stk-id="40"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkhXTrx" data-stk-id="41"/></colgroup><thead class="stk-reset"><tr class="stk-reset stk-table-row"><th class="stk-reset stk-table-cell" data-ce-tag="th">Символ</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Что означает</th><th class="stk-reset stk-table-cell" data-ce-tag="th"><strong class="stk-reset">Пример использования шаблона</strong></th><th class="stk-reset stk-table-cell" data-ce-tag="th"><strong class="stk-reset">Пример вывода</strong></th></tr></thead><tbody class="stk-reset"><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">.</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ, кроме новой строки (\n)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">H.llo, .orld<br><br>20.. год</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример вывода">Hello, world; Hallo, 2orld<br><br>2022 год, 2010 год</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">[…]</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ из указанных в скобках. Символы можно задавать как перечислением, так и указывая диапазон через дефис</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">[abc123]<br><br>[A-Z]<br><br>[A-Za-z0-9]<br><br>[А-ЯЁа-яё]</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример вывода">а; 1<br><br>B; T<br><br>A; s; 1<br><br>А; ё</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">[^…]</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ, кроме указанных в скобках</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">[^A-Za-z]</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример вывода">з, 4</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">^</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Начало строки</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">^Добрый день,</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Пример вывода">0</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">$</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Конец строки</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">До свидания!$</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Пример вывода">0</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">|</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Логическое ИЛИ. Регулярное выражение будет искать один из нескольких вариантов</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">[0-9]|[IVXLCDM] — регулярное выражение будет находить совпадение, если цифра является либо арабской, либо римской</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример вывода">5; V</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Экранирование. Помогает регулярным выражениям ориентироваться, является ли следующий за <u class="stk-reset">\</u> символ обычным или специальным</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Пример использования шаблона">\A\d\w\Z — экранирование превращает буквы алфавита в спецсимволы.<br><br>\[\.\] — экранирование превращает спецсимволы в обычные</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Пример вывода">0</td></tr></tbody></table><div class="stk-grid" data-ce-tag="grid" data-stk-css="stk7WayG"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание 1.</strong> Регулярные выражения зависимы от регистра, то есть «А» и «а» при поиске будут считаться разными символами.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание 2</strong><strong class="stk-reset">.</strong> Буквы «Ё» и «ё» не входят в диапазон «А — Я» и «а — я». Так что, задавая русский алфавит, их нужно выписывать отдельно.</p></div></div><p class="stk-reset" data-ce-tag="paragraph">На экранировании остановимся подробнее. По умолчанию символы <u class="stk-reset">.^$*+? {}[]\|()</u> являются спецсимволами — то есть они выполняют определённые функции. Чтобы сделать спецсимволы обычными, их нужно экранировать <u class="stk-reset">\</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Таким образом, <u class="stk-reset">.</u> будет обозначать любой символ, а <u class="stk-reset">\.</u> — знак точки. Чтобы написать обратный слеш, его тоже нужно экранировать, то есть в регулярных выражениях он будет выглядеть так: <u class="stk-reset">\\</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Обратная ситуация с некоторыми алфавитными символами. По умолчанию они считаются просто буквами, но при экранировании начинают играть роль спецсимволов.</p><table data-responsive-type="cards" class="stk-table--zebra stk-reset stk-table" data-ce-tag="table"><colgroup><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkYvNvO" data-stk-id="90"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stk3fRtE" data-stk-id="91"/></colgroup><thead class="stk-reset"><tr class="stk-reset stk-table-row"><th class="stk-reset stk-table-cell" data-ce-tag="th">Символ</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Что означает</th></tr></thead><tbody class="stk-reset"><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\d</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любая цифра. То же самое, что [0-9]</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\D</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ, кроме цифры. То же самое, что [^0-9]</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\w</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любая буква, цифра и нижнее подчёркивание</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\W</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ, кроме буквы, цифры и нижнего подчёркивания</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\s</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой пробельный символ (пробел, новая строка, табуляция, возврат каретки и тому подобное)</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\S</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Любой символ, кроме пробельного</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\A</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Начало строки. То же самое, что ^</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\Z</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Конец строки. То же самое, что $</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\b</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Начало или конец слова</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\B</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Середина слова</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">\n, \t\, \r</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Стандартные строковые обозначения: новая строка, табуляция, возврат каретки</td></tr></tbody></table><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkzGRET"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание.</strong> <u class="stk-reset">\<strong class="stk-reset">A</strong>, \Z, \b</u> и <u class="stk-reset">\B</u> указывают не на конкретный символ, а на положение других символов относительно друг друга. Можно сказать, что они указывают на пространство между символами.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Например, регулярное выражение <u class="stk-reset">\<strong class="stk-reset">b</strong>[А-ЯЁаяё]\<strong class="stk-reset">b</strong></u> будет искать только те буквы, которые отделены друг от друга пробелами или знаками препинания.</p></div></div><p class="stk-reset" data-ce-tag="paragraph">Часто при записи регулярного выражения какая-то часть шаблона должна повторяться определённое количество раз. Число вхождений в синтаксисе regex задают с помощью квантификаторов. Они всегда помещаются после той части шаблона, которую нужно повторить.</p><table data-responsive-type="cards" class="stk-table--zebra stk-reset stk-table" data-ce-tag="table"><colgroup><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkdmuoD" data-stk-id="134"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkLa_bt" data-stk-id="135"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stk9H541" data-stk-id="136"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkvBZUw" data-stk-id="137"/></colgroup><thead class="stk-reset"><tr class="stk-reset stk-table-row"><th class="stk-reset stk-table-cell" data-ce-tag="th">Символ</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Что означает</th><th class="stk-reset stk-table-cell" data-ce-tag="th"><strong class="stk-reset">Примеры шаблона</strong></th><th class="stk-reset stk-table-cell" data-ce-tag="th">Примеры вывода</th></tr></thead><tbody class="stk-reset"><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">{}</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">Указывает количество вхождений, можно задавать единичным числом или диапазоном</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Примеры шаблона">\d{4} — цифра, четыре подряд<br><br>\d{1,4} — цифра, от одного до четырёх раз подряд<br><br>\d{2,} — цифра, от двух раз подряд<br><br>\d{,4} — цифра, от 0 до 4 раз подряд</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Примеры вывода">1243, 1876<br><br><br>1, 12, 176, 1589<br><br><br><br>22, 456, 988888<br><br><br>5, 15, 987, 1234</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">?</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">От нуля до одного вхождения. То же самое, что {0,1}</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Примеры шаблона">\d?</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Примеры вывода">0</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">*</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">От нуля вхождений. То же самое, что {0,}</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Примеры шаблона">\d*</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Примеры вывода">0</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Символ">+</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что означает">От одного вхождения. То же самое, что {1,}</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Примеры шаблона">\d+</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Примеры вывода">0</td></tr></tbody></table><p class="stk-reset" data-ce-tag="paragraph">Теперь давайте ещё раз посмотрим на наше регулярное выражение для поиска дат по учебнику истории:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">(?:\d{<span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>})|(?:[IVX]+ век)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">В нём есть несколько дополнительных символов, о которых рассказано ниже, но начинка этого выражения уже понятна.</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item"><span style="color:#34C924" class="stk-reset">\d</span><span style="color:red" class="stk-reset">{4}</span> — <span style="color:#34C924" class="stk-reset">цифра</span>, <span style="color:red" class="stk-reset">четыре подряд</span></li><li class="stk-reset stk-list-item" data-ce-tag="list-item">| — логическое ИЛИ</li><li class="stk-reset stk-list-item" data-ce-tag="list-item"><span class="stk-reset" style="color:#34C924">[IVX]</span><span class="stk-reset" style="color:red">+</span> <span class="stk-reset" style="color:blue">век</span> — <span class="stk-reset" style="color:#34C924">символ I, V или X</span>, <span class="stk-reset" style="color:red">одно или более вхождений</span>, пробел, <span class="stk-reset" style="color:blue">слово «век»</span></li></ul><p class="stk-reset" data-ce-tag="paragraph">Попрактиковаться в составлении регулярных выражений можно на сайте <a href="https://regex101.com/" target="_blank" class="stk-reset">regex101.com</a>. А мы разберём основные приёмы их использования и решим несколько задач.</p></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-3"><strong class="stk-reset">Как ведётся поиск</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Уточним ещё несколько терминов regex.</p><p class="stk-reset" data-ce-tag="paragraph">Регулярные выражения — это инструмент для работы со строками, которые и являются основной их единицей.</p><p class="stk-reset" data-ce-tag="paragraph">Строка представляет собой как само регулярное выражение, так и текст, по которому ведётся поиск.</p><p class="stk-reset" data-ce-tag="paragraph">Найденные в тексте совпадения с шаблоном называются подстроками. Например, у нас есть регулярное выражение <u class="stk-reset">м.</u> (буква «м», затем любой символ) и текст «Мама мыла раму». Применяя регулярное выражение к тексту, мы найдём подстроки «ма», «мы» и «му». Подстроку «Ма» наше выражение пропустит из-за разницы в регистре.</p><p class="stk-reset" data-ce-tag="paragraph">Есть и более мелкая единица, чем подстрока, — группа. Она представляет собой часть подстроки, которую мы попросили выделить специально. Группы выделяются круглыми скобками <u class="stk-reset">(…)</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Возьмём ту же строку «Мама мыла раму» и применим к ней следующее регулярное выражение:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">(\w)(\w{<span class="hljs-number" style="color: rgb(255, 115, 253);">3</span>})</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Оно значит: буквенный символ, выделенный группой, и за ним ещё три буквенных символа, также выделенных группой. Итого весь шаблон представляет собой четыре буквенных символа.</p><p class="stk-reset" data-ce-tag="paragraph">В нашем тексте это выражение найдёт три совпадения, в каждом из которых выделит две группы:</p><table data-responsive-type="cards" class="stk-table--zebra stk-reset stk-table" data-ce-tag="table"><colgroup><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stknwHvI" data-stk-id="186"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkIzv9o" data-stk-id="187"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkhtmBk" data-stk-id="188"/></colgroup><thead class="stk-reset"><tr class="stk-reset stk-table-row"><th class="stk-reset stk-table-cell" data-ce-tag="th">Подстрока</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Группа 1</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Группа 2</th></tr></thead><tbody class="stk-reset"><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Подстрока">Мама</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 1">М</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 2">ама</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Подстрока">мыла</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 1">м</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 2">ыла</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Подстрока">раму</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 1">р</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Группа 2">аму</td></tr></tbody></table><p class="stk-reset" data-ce-tag="paragraph">Это помогает извлечь из найденной подстроки конкретную информацию, отбросив всё остальное. Например, мы нашли адрес, состоящий из названия улицы, номера дома и номера квартиры. Подстрока будет представлять собой адрес целиком, а в группы можно поместить отдельно каждый его структурный элемент — и потом обращаться к нему напрямую.</p><p class="stk-reset" data-ce-tag="paragraph">Группам можно давать имена с помощью такой формы: <u class="stk-reset">(? P<name>…)</u></p><p class="stk-reset" data-ce-tag="paragraph">Вот так будет выглядеть наш шаблон, ищущий четырёхбуквенные слова, если мы дадим имена группам:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">?P<first_letter>\w)(?P<rest_letters>\w{<span class="hljs-number" style="color: rgb(255, 115, 253);">3</span>})</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Уберём группы и упростим регулярное выражение, чтобы оно искало только подстроку:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">\w{<span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Немного изменим текст, по которому ищем совпадения: «Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке».</p><p class="stk-reset" data-ce-tag="paragraph">Регулярное выражение ищет четыре буквенных символа подряд, поэтому в качестве отдельных подстрок находит также «пило», «раме», «рабо», «тает», «лесо» и «пилк».</p><h3 class="stk-theme_26309__mb_05 stk-theme_26309__style_medium_header stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Задача 0. Пересечение подстрок и граница слова</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Исправьте регулярное выражение так, чтобы оно находило только четырёхбуквенные слова. То есть оно должно найти подстроки «мама», «мыла», «раму» и «папа» — и ничего больше.<br></p><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Подсказка, если не можете решить задачу</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><p class="stk-reset" data-ce-tag="paragraph">Используйте символ <u class="stk-reset">\b</u>.</p></div></details><div class="stk-grid" data-ce-tag="grid" data-stk-css="stk9Hai-"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset " data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание.</strong> При написании regex нужно помнить, что они ищут только непересекающиеся подстроки. Под шаблон <u class="stk-reset">\w{4}</u> в слове «работает» подходят не только подстроки «рабо» и «тает», но и «абот», «бота», «отае». Их регулярное выражение не находит, потому что тогда бы эти подстроки пересеклись с другими — а в regex так нельзя.</p></div></div></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-4"><strong class="stk-reset">Квантификаторы и логическое ИЛИ при группировке</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Нередко при использовании регулярных выражений требуется применить квантификатор либо логическое ИЛИ не к отдельному символу, а к целой группе. Именно так мы поступили в нашем шаблоне для поиска дат по учебнику истории:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">(?:\d{<span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>})|(?:[IVX]+ век)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">С помощью скобок мы сказали: выдайте совпадение, если в тексте присутствует хотя бы один из двух вариантов — либо год, либо век.</p><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkOrOle"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание.</strong><u class="stk-reset">? :</u> в начале группы означает, что мы просим regex не запоминать эту группу. Если все группы открываются символами<u class="stk-reset">? :</u>, то регулярные выражения вернут только подстроку и ни одной группы.</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">В Python это может быть полезно, потому что некоторые re-функции возвращают разные результаты в зависимости от того, запомнили ли регулярные выражения какие-то группы или нет.</p></div></div><p class="stk-reset" data-ce-tag="paragraph">Также к группам удобно применять квантификаторы. Например, имена многих дроидов в «Звёздных войнах» построены по принципу: буква — цифра — буква — цифра.</p><p class="stk-reset" data-ce-tag="paragraph">Вот так это выглядит без групп:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">[A-Z]\d[A-Z]\d</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">И вот так с ними:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">(?:[A-Z]\d){<span class="hljs-number" style="color: rgb(255, 115, 253);">2</span>}</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Особенно полезно использовать незапоминаемые группы со сложными шаблонами.</p></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-5"><strong class="stk-reset">Регулярные выражения в Python: модуль re и Match-объекты</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Чтобы работать с регулярными выражениями в Python, необходимо импортировать модуль <strong class="stk-reset">re</strong>:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-keyword" style="color: rgb(150, 203, 254);">import</span> re</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Это даёт доступ к нескольким функциям. Вот их краткое описание.</p><table data-responsive-type="cards" class="stk-table--zebra stk-reset stk-table" data-ce-tag="table"><colgroup><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkuTqcN" data-stk-id="252"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkhgb43" data-stk-id="253"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stk3JlBZ" data-stk-id="254"/><col class="stk-reset stk-reset stk-reset stk-reset stk-reset" data-stk-css="stkXtfRJ" data-stk-id="255"/></colgroup><thead class="stk-reset"><tr class="stk-reset stk-table-row"><th class="stk-reset stk-table-cell" data-ce-tag="th">Функция</th><th class="stk-reset stk-table-cell" data-ce-tag="th">Что делает</th><th class="stk-reset stk-table-cell" data-ce-tag="th"><strong class="stk-reset">Если находит совпадение</strong></th><th class="stk-reset stk-table-cell" data-ce-tag="th"><strong class="stk-reset">Если не находит совпадение</strong></th></tr></thead><tbody class="stk-reset"><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.match (pattern, string)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Ищет pattern в начале строки string</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает Match-объект</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает None</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.search (pattern, string)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Ищет pattern по всей строке string</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает Match-объект с первым совпадением, остальные не находит</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает None</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.finditer (pattern, string)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Ищет pattern по всей строке string</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает итератор, содержащий Match-объекты для каждого найденного совпадения</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает пустой итератор</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.findall (pattern, string)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Ищет pattern по всей строке string</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает список со всеми найденными совпадениями</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает None</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.split (pattern, string, [maxsplit=0])</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Разделяет строку string по подстрокам, соответствующим pattern</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает список строк, на которые разделила исходную строку</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает список строк, единственный элемент которого — неразделённая исходная строка</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.sub (pattern, repl, string)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Заменяет в строке string все pattern на repl</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Возвращает строку в изменённом виде</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если не находит совпадение">Возвращает строку в исходном виде</td></tr><tr class="stk-reset stk-table-row"><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Функция">re.compile (pattern)</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Что делает">Собирает регулярное выражение в объект для будущего использования в других re-функциях</td><td class="stk-reset stk-table-cell" data-ce-tag="td" data-cell-header="Если находит совпадение">Ничего не ищет, всегда возвращает Pattern-объект</td><td class="stk-reset stk-table-cell stk-theme_26309__color_26309_custom_color_0" data-ce-tag="td" data-cell-header="Если не находит совпадение">0</td></tr></tbody></table><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkM3bWx"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset " data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание.</strong> Напоминаем, что регулярные выражения по умолчанию ищут только непересекающиеся подстроки.</p></div></div><p class="stk-reset" data-ce-tag="paragraph">Для написания регулярных выражений в Python используют r-строки (их называют сырыми, или необработанными). Это связано с тем, что написание знака \ требует экранирования не только в регулярных выражениях, но и в самом Python тоже.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы программистам не приходилось экранировать экранирование и писать нагромождения обратных слешей, и придумали r-строки. Синтаксически они обозначаются так:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-string" style="color: rgb(168, 255, 96);">r'...'</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__mb_05 stk-reset stk-theme_26309__style_medium_header" data-ce-tag="paragraph"><strong class="stk-reset">re-функции с возвратом Match-объекта</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Перечислим самые популярные из них.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.match (pattern, string)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Находит совпадение только в том случае, если соответствующая шаблону подстрока находится в начале строки, по которой ведётся поиск:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'Мама'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама'</span>>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><span class="hljs-keyword" style="color: rgb(150, 203, 254);">None</span>
</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Как видим, поиск по шаблону «Мама» нашёл совпадение и вернул Match-объект. Слово же «мыла», хотя и есть в строке, находится не в начале. Поэтому регулярное выражение ничего не находит и возвращается None.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.search (pattern, string)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Ищет совпадения по всему тексту:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.search (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'Мама'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама'</span>>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.search (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">5</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">9</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">При этом re.search возвращает только первое совпадение, даже если в строке, по которой ведётся поиск, их больше. Проверим это:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.search (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а потом ещё раз мыла, потому что не домыла'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">5</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">9</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.finditer (pattern, string)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Возвращает итератор с объектами, к которым можно обратиться через цикл:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">results = re.finditer (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а потом ещё раз мыла, потому что не домыла'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (results)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><callable_iterator object at <span class="hljs-number" style="color: rgb(255, 115, 253);">0x000001C4CDE446D0</span>>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">for</span> match <span class="hljs-keyword" style="color: rgb(150, 203, 254);">in</span> results:
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">5</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">9</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">32</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">36</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">54</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">58</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Эта функция очень полезна, если вы хотите получить Match-объект для каждого совпадения.</p><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Как работать с Match-объектами</strong></h3><p class="stk-reset" data-ce-tag="paragraph">В Match-объектах хранится много всего интересного. Посмотрим внимательнее на объект с подстрокой «Мама», который нашла функция re.match:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама'</span>></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">span</strong> — это индекс начала и конца найденной подстроки в тексте, по которому мы искали совпадение. Обратите внимание, что второй индекс не включается в подстроку.</p><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">match</strong> — это собственно найденная подстрока. Если подстрока длинная, то она будет отображаться не целиком.</p><p class="stk-reset" data-ce-tag="paragraph">Это, конечно же, не всё, что можно получить от Match-объекта. Рассмотрим ещё несколько методов.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">group</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Возвращает найденную подстроку, если ему не передавать аргумент или передать аргумент 0. То же самое делает обращение к объекту по индексу 0:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match = re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'Мама'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group())
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Мама
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Мама
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match[<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>])
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Мама</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Если регулярное выражение поделено на группы, то, начиная с единицы, можно вызвать группу отдельно от строки:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match = re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(М)(ама)'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">1</span>))
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">2</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>М
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>ама
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match[<span class="hljs-number" style="color: rgb(255, 115, 253);">1</span>])
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match[<span class="hljs-number" style="color: rgb(255, 115, 253);">2</span>])
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>М
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>ама
<span class="hljs-comment" style="color: rgb(124, 124, 124);">#Методом group также можно получить кортеж из нужных групп.</span>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">1</span>,<span class="hljs-number" style="color: rgb(255, 115, 253);">2</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>(<span class="hljs-string" style="color: rgb(168, 255, 96);">'М'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'ама'</span>)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Если группы поименованы, то в качестве аргумента метода <u class="stk-reset">group</u> можно передавать их название:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match = re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?P<first_letter>М)(?P<rest_letters>ама)'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-string" style="color: rgb(168, 255, 96);">'first_letter'</span>))
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-string" style="color: rgb(168, 255, 96);">'rest_letters'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>М
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>ама</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Если одна и та же группа соответствует шаблону несколько раз, то в группу запишется только последнее совпадение:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Помещаем в группу один буквенный символ, при этом шаблон представляет собой четыре таких символа.</span>
match = re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(\w){4}'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Мама
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.group(<span class="hljs-number" style="color: rgb(255, 115, 253);">1</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>а</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">groups</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Возвращает кортеж с группами:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match = re.match (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(М)(ама)'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.groups())
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>(<span class="hljs-string" style="color: rgb(168, 255, 96);">'М'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'ама'</span>)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">span</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Возвращает кортеж с индексом начала и конца подстроки в исходном тексте. Если мы хотим получить только первый индекс, можно использовать метод <strong class="stk-reset">start</strong>, только последний — <strong class="stk-reset">end</strong>:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match = re.search (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.span())
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>(<span class="hljs-number" style="color: rgb(255, 115, 253);">5</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">9</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.start())
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><span class="hljs-number" style="color: rgb(255, 115, 253);">5</span>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match.end())
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><span class="hljs-number" style="color: rgb(255, 115, 253);">9</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">re-функции без возврата Match-объекта</strong></h3><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.findall (pattern, string)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Возвращает просто список совпадений. Никаких Match-объектов, к которым нужно дополнительно обращаться:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#В этом примере в качестве регулярного выражения мы используем правильный ответ на задание 0.</span>
match_list = re.findall (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'\b\w{4}\b'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match_list)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'мыла'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'раму'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'папа'</span>]</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Функция ведёт себя по-другому, если в регулярном выражении есть деление на группы. Тогда функция возвращает список кортежей с группами:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">match_list = re.findall (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'\b(\w{1})(\w{3})\b'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (match_list)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[(<span class="hljs-string" style="color: rgb(168, 255, 96);">'М'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'ама'</span>), (<span class="hljs-string" style="color: rgb(168, 255, 96);">'м'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'ыла'</span>), (<span class="hljs-string" style="color: rgb(168, 255, 96);">'р'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'аму'</span>), (<span class="hljs-string" style="color: rgb(168, 255, 96);">'п'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'апа'</span>)]</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.split (pattern, string, [maxsplit=0])</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Аналог метода <u class="stk-reset">str.split</u>. Делит исходную строку по шаблону, а сам шаблон исключает из результата:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Поделим строку по запятой и пробелу после неё.</span>
split_string = re.split (<span class="hljs-string" style="color: rgb(168, 255, 96);">r', '</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (split_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'а папа был на пилораме'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'потому что работает на лесопилке.'</span>]</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph"><u class="stk-reset">re.split</u> также имеет дополнительный аргумент <u class="stk-reset">maxsplit</u> — это максимальное количество частей, на которые функция может поделить строку. По умолчанию <u class="stk-reset">maxsplit</u> равен нулю, то есть не устанавливает никаких ограничений:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Приравняем аргумент maxsplit к единице.</span>
split_string = re.split (<span class="hljs-string" style="color: rgb(168, 255, 96);">r', '</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>, maxsplit=<span class="hljs-number" style="color: rgb(255, 115, 253);">1</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (split_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'а папа был на пилораме, потому что работает на лесопилке.'</span>]</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Если в <u class="stk-reset">re.split</u> мы указываем группы, то они попадают в список строк в качестве отдельных элементов. Для наглядности поделим исходную строку на слог «па»:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Помещаем буквы «п» и «а» в одну группу.</span>
split_string = re.split (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(па)'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (split_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а '</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'па'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">''</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'па'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">' был на пилораме, потому что работает на лесопилке.'</span>]
<span class="hljs-comment" style="color: rgb(124, 124, 124);">#Помещаем буквы «п» и «а» в разные группы.</span>
split_string = re.split (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(п)(а)'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (split_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>[<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а '</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'п'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'а'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">''</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'п'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'а'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">' был на пилораме, потому что работает на лесопилке.'</span>]</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__mb_05 stk-theme_26309__style_small_header" data-ce-tag="paragraph"><strong class="stk-reset">re.sub (pattern, repl, string)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Требует указания дополнительного аргумента в виде строки, на которую и будет заменять найденные совпадения:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">new_string = re.sub (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'Мама'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Дочка'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму, а папа был на пилораме, потому что работает на лесопилке.'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (new_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Дочка мыла раму, а папа был на пилораме, потому что работает на лесопилке.</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Дополнительные возможности у функции появляются при применении групп. В качестве аргумента замены ему можно передать не строку, а ссылку на номер группы в виде <u class="stk-reset">\n</u>. Тогда он подставит на нужное место соответствующую группу из шаблона. Это очень удобно, когда нужно поменять местами структурные элементы в тексте:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">new_string = re.sub (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(\w+) (\w+) (\w+),'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">r'\2 \3 \1 –'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Бендер Остап Ибрагимович, директор ООО "Рога и копыта"'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (new_string)
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Остап Ибрагимович Бендер — директор ООО <span class="hljs-string" style="color: rgb(168, 255, 96);">"Рога и копыта"</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">re.compile (pattern)</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Используется для ускорения и упрощения кода, когда одно и то же регулярное выражение применяется в нём несколько раз. Её синтаксис выглядит так:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">pattern = re.compile (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'Мама'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (pattern.search (<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><re.Match object; span=(<span class="hljs-number" style="color: rgb(255, 115, 253);">0</span>, <span class="hljs-number" style="color: rgb(255, 115, 253);">4</span>), match=<span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама'</span>>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (pattern.sub (<span class="hljs-string" style="color: rgb(168, 255, 96);">'Дочка'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'Мама мыла раму'</span>))
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Дочка мыла раму</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Деление r-строк</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Нередко в регулярных выражениях нужно учесть сразу много вариантов и опций, из-за чего их структура усложняется. А regex даже простые и короткие читать нелегко, что уж говорить о длинных.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы хоть как-то облегчить чтение регулярок, в Python r-строки можно делить точно так же, как и обычные. Возьмём наше выражение для поиска дат по учебнику истории:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">re.findall (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:\d{4})|(?:[IVX]+ век)'</span>, text)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Его же можно написать вот в таком виде:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">re.findall (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:\d{4})'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'|'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:[IVX]+ век)'</span>, text)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-6"><strong class="stk-reset">Жадный и ленивый пропуск</strong></h2><p class="stk-reset" data-ce-tag="paragraph">Часто при написании регулярных выражений приходится использовать квантификаторы, охватывающие диапазон значений. Например, <u class="stk-reset">\d{1,4}</u>. Как регулярные выражения решают, сколько цифр им захватить, одну или четыре? Это определяется пропуском квантификаторов.</p><p class="stk-reset" data-ce-tag="paragraph">По умолчанию все квантификаторы являются жадными, то есть стараются захватить столько подходящих под шаблон символов, сколько смогут.</p><p class="stk-reset" data-ce-tag="paragraph">В некоторых случаях это может стать проблемой. Например, возьмём часть оглавления поэмы Венедикта Ерофеева «Москва — Петушки», записанную в одну строку:</p><p class="stk-reset" data-ce-tag="paragraph">Фрязево — 61-й километр..........64 61-й километр — 65-й километр…68 65-й километр — Павлово-Посад…71 Павлово-Посад — Назарьево........73 Назарьево — Дрезна...............77 Дрезна — 85-й километр...........80</p><p class="stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph">Нужно написать регулярное выражение, которое выделит каждый пункт оглавления. Для этого определим признаки, по которым мы будем это делать:</p><ul class="stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-reset stk-list-item" data-ce-tag="list-item">Каждый пункт начинается с буквы или цифры (для этого используем шаблон <u class="stk-reset">\w</u>).</li><li class="stk-reset stk-list-item" data-ce-tag="list-item">Он может содержать внутри себя любой набор символов: буквы, цифры, знаки препинания (для этого используем шаблон <u class="stk-reset">.+</u>).</li><li class="stk-reset stk-list-item" data-ce-tag="list-item">Он заканчивается на точку, после которой следует от одной до трёх цифр (для этого используем шаблон <u class="stk-reset">\.\d{1,3}</u>).</li></ul><p class="stk-reset" data-ce-tag="paragraph">Посмотрим в конструкторе, как работает наше выражение:</p><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/07175904102022_5c20dcbcfbab07ab6c2df7e27444d5ac2afca569.png" data-image-id="41800" data-image-name="1.png" width="1540" height="427" loading="lazy" class="stk-image stk-reset"/></div><figcaption style="display:block" class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Что же произошло? Почему найдено только одно совпадение, причем за него посчитали весь текст сразу? Всё дело в жадности квантификатора <u class="stk-reset">+</u>, который старается захватить максимально возможное количество подходящих символов.</p><p class="stk-reset" data-ce-tag="paragraph">В итоге шаблон <u class="stk-reset">\w</u> находит совпадение с буквой «Ф» в начале текста, шаблон <u class="stk-reset">\.\d{1,3}</u> находит совпадение с «.80» в конце текста, а всё, что между ними, покрывается шаблоном <u class="stk-reset">.+</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы квантификатор захватывал минимально возможное количество символов, его нужно сделать ленивым. В таком случае каждый раз, находя совпадение с шаблоном <u class="stk-reset">.</u>, регулярное выражение будет спрашивать: «Подходят ли следующие символы в строке под оставшуюся часть шаблона?»</p><p class="stk-reset" data-ce-tag="paragraph">Если нет, то функция будет искать следующее совпадение с <u class="stk-reset">.</u>. А если да, то <u class="stk-reset">.</u> закончит свою работу и следующие символы строки будут сравниваться со следующей частью регулярного выражения: <u class="stk-reset">\.\d{1,3}</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы объявить квантификатор ленивым, после него надо поставить символ <u class="stk-reset">?</u>. Сделаем ленивым квантификатор <u class="stk-reset">+</u> в нашем регулярном выражении для поиска строк в оглавлении:</p><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/07180104102022_278cadb5c5a600fd354bbb4a32acf34407bf98f0.png" data-image-id="41803" data-image-name="2.png" width="1540" height="427" loading="lazy" class="stk-image stk-reset"/></div><figcaption style="display:block" class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Скриншот: Skillbox Media</em></figcaption></figure><p class="stk-reset" data-ce-tag="paragraph">Теперь, когда мы уверены в правильности работы нашего регулярного выражения, используем функцию <u class="stk-reset">re.findall</u>, чтобы выписать оглавление построчно:</p><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);">content = <span class="hljs-string" style="color: rgb(168, 255, 96);">'Фрязево — 61-й километр..........64 61-й километр — 65-й километр....68 65-й километр — Павлово-Посад....71 Павлово-Посад — Назарьево........73 Назарьево — Дрезна...............77 Дрезна — 85-й километр...........80'</span>
strings = re.findall (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'\w.+?\.\d{1,3}'</span>, content)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">for</span> string <span class="hljs-keyword" style="color: rgb(150, 203, 254);">in</span> strings:
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (string)
<span class="hljs-comment" style="color: rgb(124, 124, 124);">#Результат на экране.</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Фрязево — <span class="hljs-number" style="color: rgb(255, 115, 253);">61</span>-й километр.........<span class="hljs-number" style="color: rgb(255, 115, 253);">.64</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><span class="hljs-number" style="color: rgb(255, 115, 253);">61</span>-й километр — <span class="hljs-number" style="color: rgb(255, 115, 253);">65</span>-й километр...<span class="hljs-number" style="color: rgb(255, 115, 253);">.68</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span><span class="hljs-number" style="color: rgb(255, 115, 253);">65</span>-й километр — Павлово-Посад...<span class="hljs-number" style="color: rgb(255, 115, 253);">.71</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Павлово-Посад — Назарьево.......<span class="hljs-number" style="color: rgb(255, 115, 253);">.73</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Назарьево — Дрезна..............<span class="hljs-number" style="color: rgb(255, 115, 253);">.77</span>
<span class="hljs-meta" style="color: rgb(124, 124, 124);">>>> </span>Дрезна — <span class="hljs-number" style="color: rgb(255, 115, 253);">85</span>-й километр..........<span class="hljs-number" style="color: rgb(255, 115, 253);">.80</span></pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></div><div class="stk-theme_26309__mb_15 stk-grid" data-ce-tag="grid"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><h2 class="stk-reset stk-theme_26309__style_large_header" data-ce-tag="paragraph" id="stk-7"><strong class="stk-reset">Примеры и задачи</strong></h2><p class="stk-reset" data-ce-tag="paragraph">В некоторых случаях одну и ту же задачу можно решить разными способами, используя разные возможности регулярок. Попробуйте решить следующие задачи самостоятельно. Возможно, у вас даже получится сделать это более эффективно.</p><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Задача 1. Замена имён в судебном решении</strong></h3><p class="stk-reset" data-ce-tag="paragraph">При обнародовании судебных решений из них извлекают персональные данные участников процесса — фамилии, имена и отчества. Каждое слово в Ф. И. О. начинается с заглавной буквы, при этом фамилия может быть двойная.</p><p class="stk-reset" data-ce-tag="paragraph">Напишите программу, которая заменит в тексте Ф. И. О. подсудимого на N.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Ввод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Подсудимая Эверт-Колокольцева Елизавета Александровна в судебном заседании вину инкриминируемого правонарушения признала в полном объёме и суду показала, что 14 сентября 1876 года, будучи в состоянии алкогольного опьянения от безысходности, в связи с состоянием здоровья позвонила со своего стационарного телефона в полицию, сообщив о том, что у неё в квартире якобы заложена бомба. После чего приехали сотрудники полиции, скорая и пожарные, которым она сообщила, что бомба — это она.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Вывод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">«Подсудимая N в судебном заседании» и далее по тексту.</p><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Подсказка</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><p class="stk-reset" data-ce-tag="paragraph">Используйте незапоминаемую опциональную группу вида <u class="stk-reset">(? : …)?</u> , чтобы обозначить вторую часть фамилии после дефиса.</p></div></details><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Решение</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Сначала кладём в переменную string текст строки, по которой ведём поиск.</span>
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (re.sub (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'[А-ЯЁ]\w*'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:-[А-ЯЁ]\w*)?'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?: [А-ЯЁ]\w*){2}'</span>, <span class="hljs-string" style="color: rgb(168, 255, 96);">'N'</span>, string))</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></details><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Задача 2. Поиск адресов</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Большинство адресов состоит из трёх частей: название улицы, номер дома и номер квартиры. Название улицы может состоять из нескольких слов, каждое из которых пишется с заглавной буквы. Номер дома может содержать после себя букву.</p><p class="stk-reset" data-ce-tag="paragraph">Перед названием улицы может быть написано «Улица», «улица», «Ул.» или «ул.», перед номером дома — «дом» или «д.», перед номером квартиры — «квартира» или «кв.». Также номер дома и номер квартиры могут быть разделены дефисом без пробелов.</p><p class="stk-reset" data-ce-tag="paragraph">Дан текст, в нём нужно найти все адреса и вывести их в виде «Пушкина 32-135».</p><p class="stk-reset" data-ce-tag="paragraph">Для упрощения мы не будем учитывать дома, которые находятся не на улицах, а на площадях, набережных, бульварах и так далее.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Ввод:</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Добрый день!</p><p class="stk-reset" data-ce-tag="paragraph">Сегодня на выезды потребуется отправить трёх-четырёх специалистов, остальных держите в офисе. Некоторые заявки пришли на конкретных людей, но можно вызвать и других, смотрите по ситуации, как лучше их отправить, чтобы всех объездить сегодня.</p><p class="stk-reset" data-ce-tag="paragraph">Петрову П. П. попросили выехать по адресам ул. Культуры 78 кв. 6, улица Мира дом 12Б квартира 144. Смирнова С. С. просят подъехать только по адресу: Восьмого Марта 106-19. Без предпочтений по специалистам пришли запросы с адресов: улица Свободы 54 6, Улица Шишкина дом 9 кв. 15, ул. Лермонтова 18 кв. 93.</p><p class="stk-reset" data-ce-tag="paragraph">Все адреса скопированы из заявок, корректность подтверждена.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Вывод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Культуры 78-6</p><p class="stk-reset" data-ce-tag="paragraph">Мира 12Б-144</p><p class="stk-reset" data-ce-tag="paragraph">Восьмого Марта 106-19</p><p class="stk-reset" data-ce-tag="paragraph">Свободы 54-6</p><p class="stk-reset" data-ce-tag="paragraph">Шишкина 9-15</p><p class="stk-reset" data-ce-tag="paragraph">Лермонтова 18-93</p><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Подсказка</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><p class="stk-reset" data-ce-tag="paragraph">Используйте деление на группы, чтобы удобно выстроить структуру выражения. Попросите regex запоминать только нужные вам части адреса, чтобы функция не возвращала вам лишние подгруппы.</p></div></details><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Решение</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Сначала кладём в переменную string текст строки, по которой ведём поиск.</span>
pattern = re.compile (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:[Уу]л(?:\.|ица) )?'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'((?:[А-ЯЁ]\w+)(?: [А-ЯЁ]\w+)*)'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r' (?:дом |д\. )?'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(\d+\w?)'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'[ -](?:квартира |кв\. )?'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(\d+)'</span>)
addresses = pattern.findall (text)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">for</span> address <span class="hljs-keyword" style="color: rgb(150, 203, 254);">in</span> addresses:
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (f<span class="hljs-string" style="color: rgb(168, 255, 96);">'{address[0]} {address[1]}-{address[2]}'</span>)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></details><p class="stk-reset" data-ce-tag="paragraph">Структура этого регулярного выражения довольно сложная. Чтобы в нём разобраться, посмотрите на схему. Прямоугольники обозначают обязательные элементы, овалы — опциональные. Развилки символизируют разные варианты, которые допускает наш шаблон. Красным цветом очерчены группы, которые мы запоминаем.</p><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/07180004102022_bd473197c461193ea9b6d317f4c236910d065887.png" data-image-id="41801" data-image-name="3.png" width="1540" height="2785" loading="lazy" class="stk-image stk-reset"/></div><figcaption style="display:block" class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Инфографика: Майя Мальгина для Skillbox Media</em></figcaption></figure><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Задача 3. Метод Довлатова</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Писатели в поиске собственного неповторимого стиля нередко изобретают оригинальные творческие приёмы и неукоснительно им следуют. Например, Сергей Довлатов следил за тем, чтобы слова в предложении не начинались с одной и той же буквы.</p><p class="stk-reset" data-ce-tag="paragraph">Даны несколько предложений. Программа должна проверить, встречаются ли в каждом из них слова на одинаковую букву. Если таких нет, она печатает: «Метод Довлатова соблюдён». А если есть: «Вы расстроили Сергея Донатовича».</p><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Важно.</strong> Чтобы регулярные выражения не рассматривали заглавные и прописные буквы как разные символы, передайте re-функции дополнительный аргумент <u class="stk-reset">flags=re.I</u> или <u class="stk-reset">flags=re.IGNORECASE</u>.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Ввод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Здесь все слова начинаются с разных букв.</p><p class="stk-reset" data-ce-tag="paragraph">А в этом предложении есть слова, которые всё-таки начинаются на одну и ту же букву.</p><p class="stk-reset" data-ce-tag="paragraph">А здесь совсем интересно: символ «а» однобуквенный.</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Вывод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Метод Довлатова соблюдён</p><p class="stk-reset" data-ce-tag="paragraph">Вы расстроили Сергея Донатовича</p><p class="stk-reset" data-ce-tag="paragraph">Вы расстроили Сергея Донатовича</p><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Подсказка</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><p class="stk-reset" data-ce-tag="paragraph">Чтобы указать на начало слова, используйте символ <u class="stk-reset">\b</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы в каждом совпадении regex не старалось захватить максимум, используйте ленивый пропуск.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы найти повторяющийся символ, используйте ссылку на группу в виде <u class="stk-reset">\1</u>.</p></div></details><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Решение</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Сначала кладём в переменную string текст строки, по которой ведём поиск.</span>
pattern = <span class="hljs-string" style="color: rgb(168, 255, 96);">r'\b(\w)\w*.*?\b\1'</span>
match = re.search (pattern, string, flags=re.I)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">if</span> match <span class="hljs-keyword" style="color: rgb(150, 203, 254);">is</span> <span class="hljs-keyword" style="color: rgb(150, 203, 254);">None</span>:
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (<span class="hljs-string" style="color: rgb(168, 255, 96);">'Метод Довлатова соблюдён'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">else</span>:
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (<span class="hljs-string" style="color: rgb(168, 255, 96);">'Вы расстроили Сергея Донатовича'</span>)</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></details><h3 class="stk-theme_26309__style_medium_header stk-theme_26309__mb_05 stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Задача 4. Улучшенный поиск дат в учебнике</strong></h3><p class="stk-reset" data-ce-tag="paragraph">Вернёмся к регулярному выражению, которое ищет даты в учебнике истории: <u class="stk-reset">(? :\d{4})|(? : [IVX]+ век)</u>.</p><p class="stk-reset" data-ce-tag="paragraph">Оно в целом справляется со своей задачей, но также находит много ненужных чисел. Например, количество человек, которые участвовали в битве, тоже может быть описано четырьмя цифрами подряд.</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы не получать лишние результаты, обратим внимание на то, как именно могут быть записаны годы. Есть несколько вариантов записи: 1400 год, 1400 г., 1400–1500 годы, 1400–1500 гг., (1400), (1400–1500).</p><p class="stk-reset" data-ce-tag="paragraph">Чтобы немного упростить задачу и не раздувать регулярное выражение, мы не будем искать конструкции «с такого-то по такой-то год» и «между таким-то и таким-то годом».</p><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkjFeAA"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col"><p class="stk-reset " data-ce-tag="paragraph"><strong class="stk-reset">Важное замечание.</strong> Не забывайте про экранирование, если хотите использовать точки и скобки в качестве обычных, а не специальных символов. Так программа правильно поймёт, что вы имеете в виду.</p></div></div><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Ввод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">Началом Реформации принято считать 31 октября 1517 г. — день, когда Мартин Лютер (1483–1546) прибил к дверям виттенбергской Замковой церкви свои «95 тезисов», в которых выступил против злоупотреблений Католической церкви. Реформация охватила практически всю Европу и продолжалась в течение всего XVI века и первой половины XVII века. Одно из самых известных и кровавых событий Реформации — Варфоломеевская ночь во Франции, произошедшая в ночь на 24 августа 1572 года.</p><p class="stk-reset" data-ce-tag="paragraph">Точное число жертв так и не удалось установить достоверно. Погибли по меньшей мере 2000 гугенотов в Париже и 3000 — в провинциях. Герцог де Сюлли, сам едва избежавший смерти во время резни, говорил о 70 000 жертв. Для Парижа единственным точным числом остаётся 1100 погибших во время Варфоломеевской ночи.</p><p class="stk-reset" data-ce-tag="paragraph">Этому событию предшествовали три других, произошедшие в 1570–1572 годах: Сен-Жерменский мирный договор (1570), свадьба гугенота Генриха Наваррского и Маргариты Валуа (1572) и неудавшееся покушение на убийство адмирала Колиньи (1572).</p><h4 class="stk-reset stk-theme_26309__style_small_header stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Вывод</strong></h4><p class="stk-reset" data-ce-tag="paragraph">['1517 г.', '(1483–1546)', 'XVI век', 'XVII век', '1572 год', '1570–1572 годах', '(1570)', '(1572)', '(1572)']</p><details class="stk-content-spoiler stk-container stk-reset stk-theme_26309__mb_05" data-ce-tag="container" data-container-name="Спойлер"><summary class="stk-container stk-reset" data-ce-tag="container" data-container-name="Переключатель спойлера"><p class="stk-reset" data-ce-tag="paragraph"><strong class="stk-reset">Решение</strong></p></summary><div class="stk-container" data-ce-tag="container" data-container-name="Контент спойлера"><figure class="stk-reset stk-embed_rendered" data-ce-tag="embed"><code class="stk-code"><pre class="hljs" style="display: block; overflow-x: auto; padding: 0.5em; background: rgb(0, 0, 0); color: rgb(248, 248, 248);"><span class="hljs-comment" style="color: rgb(124, 124, 124);">#Сначала кладём в переменную string текст строки, по которой ведём поиск.</span>
pattern = re.compile (<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:\(\d{4}(?:-\d{4})?\))'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'|'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:\d{4}-)?\d{4} '</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:год(?:ы|ах|ов)?)'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'|'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:гг?\.)'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r')'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r')'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'|'</span>
<span class="hljs-string" style="color: rgb(168, 255, 96);">r'(?:[IVX]+ век)'</span>)
<span class="hljs-keyword" style="color: rgb(150, 203, 254);">print</span> (pattern.findall (string))</pre></code><figcaption class="stk-reset stk-description" data-ce-tag="description"></figcaption></figure></div></details><p class="stk-reset" data-ce-tag="paragraph">Если вам сложно разобраться в структуре этого выражения, то вот его схема:</p><figure class="stk-reset stk-image-figure" data-ce-tag="image-figure"><div class="stk-mask" data-ce-tag="mask"><img src="/upload/setka_images/07180004102022_e3039f248dd555899a396179b51a05be377f9973.png" data-image-id="41802" data-image-name="4.png" width="1540" height="1458" loading="lazy" class="stk-image stk-reset"/></div><figcaption style="display:block" class="stk-reset stk-description" data-ce-tag="description"><em class="stk-reset">Инфографика: Майя Мальгина для Skillbox Media</em></figcaption></figure><div class="stk-grid" data-ce-tag="grid" data-stk-css="stkwZxLi"><div data-col-width="12" class="stk-grid-col stk-grid-col_last" data-ce-tag="grid-col" data-stk-css="" data-stk-css-m=""><p class="stk-reset stk-theme_26309__style_small_text stk-theme_26309__mb_05" data-ce-tag="paragraph"><strong class="stk-reset">Читайте также:</strong></p><ul class="stk-theme_26309__style_small_text stk-theme_26309__pad_hor_1 stk-reset" data-ce-tag="list"><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/kak-izuchit-python-samostoyatelno-i-besplatno/" target="_blank" class="stk-reset">Как изучить Python самостоятельно и бесплатно: алгоритм</a></li><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/test-kakoy-yazyk-sozdadite-vy-java-ili-python/" target="_blank" class="stk-reset">Тест. Какой язык создадите вы — Java или Python?</a></li><li class="stk-theme_26309__style_small_text stk-reset stk-list-item" data-ce-tag="list-item"><a href="https://skillbox.ru/media/code/chto_takoe_testirovanie_programm/" target="_blank" class="stk-reset">Что такое тестирование программ и зачем оно нужно</a></li></ul></div></div></div></div><style data-stk-css="stkwZxLi" media="all" class="">
[data-stk-css="stkwZxLi"]:not(#stk):not(#stk):not(style) {
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkjFeAA" media="all" class="">
[data-stk-css="stkjFeAA"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkM3bWx" media="all" class="">
[data-stk-css="stkM3bWx"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkOrOle" media="all" class="">
[data-stk-css="stkOrOle"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stk9Hai-" media="all" class="">
[data-stk-css="stk9Hai-"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkzGRET" media="all" class="">
[data-stk-css="stkzGRET"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stk7WayG" media="all" class="">
[data-stk-css="stk7WayG"]:not(#stk):not(#stk):not(style) {
border-left: 4px solid #f5a74f;
padding: 20px;
background-color: rgba(254, 245, 224, 1)
}
</style><style data-stk-css="stkFk3r-" class="" media="all">
[data-stk-css="stkFk3r-"]:not(#stk):not(#stk):not(style) {
width: 30%;
border: 1px solid grey
}
</style><style data-stk-css="stk44yur" class="" media="all">
[data-stk-css="stk44yur"]:not(#stk):not(#stk):not(style) {
width: 20%;
border: 1px solid grey
}
</style><style data-stk-css="stkU3cZj" class="" media="all">
[data-stk-css="stkU3cZj"]:not(#stk):not(#stk):not(style) {
width: 30%;
border: 1px solid grey
}
</style><style data-stk-css="stkhXTrx" class="" media="all">
[data-stk-css="stkhXTrx"]:not(#stk):not(#stk):not(style) {
width: 20%;
border: 1px solid grey
}
</style><style data-stk-css="stk3fRtE" class="" media="all">
[data-stk-css="stk3fRtE"]:not(#stk):not(#stk):not(style) {
width: 80%;
border: 1px solid grey
}
</style><style data-stk-css="stkdmuoD" class="" media="all">
[data-stk-css="stkdmuoD"]:not(#stk):not(#stk):not(style) {
width: 15%;
border: 1px solid grey
}
</style><style data-stk-css="stkLa_bt" class="" media="all">
[data-stk-css="stkLa_bt"]:not(#stk):not(#stk):not(style) {
width: 0%;
border: 1px solid grey
}
</style><style data-stk-css="stkvBZUw" class="" media="all">
[data-stk-css="stkvBZUw"]:not(#stk):not(#stk):not(style) {
width: 0%;
border: 1px solid grey
}
</style><style data-stk-css="stkuTqcN" class="" media="all">
[data-stk-css="stkuTqcN"]:not(#stk):not(#stk):not(style) {
width: 20%;
border: 1px solid grey
}
</style><style data-stk-css="stkXtfRJ" class="" media="all">
[data-stk-css="stkXtfRJ"]:not(#stk):not(#stk):not(style) {
width: 20%;
border: 1px solid grey
}
</style><style data-stk-css="stkYvNvO" class="" media="all">
[data-stk-css="stkYvNvO"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stk9H541" class="" media="all">
[data-stk-css="stk9H541"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stknwHvI" class="" media="all">
[data-stk-css="stknwHvI"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stkIzv9o" class="" media="all">
[data-stk-css="stkIzv9o"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stkhtmBk" class="" media="all">
[data-stk-css="stkhtmBk"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stkhgb43" class="" media="all">
[data-stk-css="stkhgb43"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style><style data-stk-css="stk3JlBZ" class="" media="all">
[data-stk-css="stk3JlBZ"]:not(#stk):not(#stk):not(style) {
border: 1px solid grey
}
</style></div> </div>
</div>
</div>
</div>
<div class="col-xl-9 col-lg-8 col-poster">
<div class="article-preview-info">
</div>
</div>
<noindex>
<div class="share" data-nosnippet>
<button class="share__handler-btn ">
<span class="share__handler-icon">
<svg width="11" height="12" viewBox="0 0 11 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 4.99902L6 0V2.99805C2.688 2.99805 0 5.68505 0 8.99805V11.498H0.0980225C0.765022 8.91205 3.107 6.99805 5.901 6.99805H6.00098V9.99805L11 4.99902Z" fill="currentColor"/>
</svg>
</span>
<span class="share__handler-text">Поделиться</span>
</button>
<div class="share__list">
<a href="#" class="share__item" data-code="vk">
<span class="share__item-icon share__item-icon--vk">
<svg width="9" height="5" viewBox="0 0 9 5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.04776 4.98054H4.53996C4.62377 4.97136 4.70279 4.9361 4.76621 4.87951C4.81226 4.81209 4.83594 4.73139 4.83369 4.64925C4.83369 4.64925 4.82574 3.94629 5.1314 3.84125C5.43701 3.73621 5.826 4.51998 6.23879 4.82297C6.39281 4.95308 6.59128 5.01558 6.79053 4.99669L7.89399 4.98054C7.89399 4.98054 8.47355 4.94415 8.19965 4.46339C7.98372 4.08315 7.70589 3.743 7.37799 3.45744C6.68338 2.77872 6.77865 2.8878 7.61219 1.71216C8.12024 0.997077 8.32269 0.556717 8.25918 0.370875C8.14651 0.254767 7.98299 0.205914 7.82655 0.241594L6.58018 0.249674C6.52565 0.241067 6.46984 0.251007 6.42141 0.277954C6.37298 0.314507 6.33466 0.363228 6.31025 0.419356C6.18259 0.772814 6.0287 1.11586 5.8498 1.44552C5.29807 2.43936 5.07579 2.49188 4.98451 2.43128C4.77416 2.28584 4.82574 1.85356 4.82574 1.54248C4.82574 0.580957 4.96468 0.176954 4.55979 0.0719133C4.36879 0.0254376 4.17259 0.00505841 3.97631 0.0113129C3.62834 -0.0214164 3.27745 0.017045 2.94429 0.124433C2.8014 0.197154 2.69423 0.358753 2.76171 0.370875C2.90334 0.385518 3.03406 0.454932 3.12688 0.564795C3.21268 0.750336 3.25481 0.953675 3.24993 1.15868C3.24993 1.15868 3.32535 2.29392 3.07925 2.43532C2.91254 2.53228 2.68232 2.33432 2.18616 1.4334C2.01958 1.11848 1.87243 0.793298 1.74557 0.459754C1.72231 0.404013 1.68704 0.354309 1.64236 0.314316C1.58589 0.272672 1.52066 0.245006 1.45184 0.233514L0.268986 0.241594C0.181167 0.241154 0.0958013 0.271066 0.0268587 0.326434C-0.00595087 0.396174 -0.00882613 0.476652 0.0189202 0.548633C0.0189202 0.548633 0.947737 2.83932 1.99563 3.99477C2.51 4.60651 3.2568 4.96526 4.04776 4.98054Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Vkontakte</span>
</a>
<a href="#" class="share__item" data-code="tw">
<span class="share__item-icon share__item-icon--tw">
<svg width="9" height="7" viewBox="0 0 9 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.52788 0.00144284V0H5.9158L6.05754 0.027414C6.15204 0.0452114 6.23783 0.068535 6.31491 0.0973918C6.39201 0.126249 6.46661 0.159917 6.53872 0.198391C6.61083 0.236864 6.67623 0.276066 6.73492 0.315982C6.79311 0.355422 6.84533 0.397265 6.89158 0.441509C6.93733 0.486237 7.0087 0.49778 7.10568 0.476138C7.20266 0.454495 7.3071 0.424433 7.419 0.38596C7.5309 0.347487 7.64156 0.304201 7.75097 0.256104C7.86039 0.208007 7.92703 0.177469 7.95091 0.164484C7.97428 0.151022 7.98671 0.143808 7.98821 0.142841L7.98969 0.140677L7.99715 0.13707L8.00461 0.133463L8.01207 0.129856L8.01953 0.126249L8.02102 0.124084L8.02326 0.122642L8.02551 0.121199L8.02699 0.119034L8.03445 0.11687L8.04191 0.115427L8.04043 0.126249L8.03818 0.13707L8.03445 0.147891L8.03072 0.158713L8.02699 0.165927L8.02326 0.173141L8.01953 0.183962C8.01705 0.191176 8.01456 0.200793 8.01207 0.212819C8.00959 0.224845 7.98596 0.272935 7.9412 0.357103C7.89644 0.441271 7.84049 0.526637 7.77335 0.613208C7.70621 0.699778 7.64604 0.765182 7.59283 0.809434C7.53911 0.854162 7.50355 0.885421 7.48614 0.903219C7.46874 0.921492 7.4476 0.938323 7.42273 0.953718L7.38543 0.977525L7.37797 0.981132L7.37051 0.984739L7.36902 0.986903L7.36678 0.988346L7.36454 0.989789L7.36305 0.991953L7.35559 0.99556L7.34813 0.999168L7.34664 1.00133L7.3444 1.00277L7.34216 1.00422L7.34067 1.00638L7.33918 1.00855L7.33694 1.00999L7.3347 1.01143L7.33321 1.0136H7.37051L7.57939 0.970311C7.71865 0.941454 7.85168 0.906588 7.9785 0.865705L8.17992 0.800777L8.2023 0.793563L8.21349 0.789956L8.22095 0.786348L8.22841 0.782741L8.23587 0.779134L8.24333 0.775527L8.25825 0.773363L8.27317 0.77192V0.786348L8.26944 0.787791L8.26571 0.789956L8.26423 0.79212L8.26198 0.793563L8.25974 0.795006L8.25825 0.79717L8.25677 0.799334L8.25452 0.800777L8.25228 0.80222L8.25079 0.804384L8.24931 0.806548L8.24706 0.807991L8.24333 0.815205L8.2396 0.82242L8.23736 0.823862C8.23637 0.825305 8.20479 0.866181 8.14262 0.946504C8.08046 1.0273 8.04689 1.06818 8.04191 1.06915C8.03694 1.07059 8.02997 1.0778 8.02102 1.09079C8.01257 1.10425 7.95985 1.15788 7.86287 1.25166C7.76589 1.34545 7.67091 1.42889 7.57791 1.502C7.48441 1.57558 7.43716 1.666 7.43616 1.77325C7.43467 1.88002 7.42895 2.00074 7.419 2.13541C7.40905 2.27007 7.3904 2.41555 7.36305 2.57186C7.3357 2.72817 7.29342 2.90492 7.23623 3.10211C7.17904 3.29929 7.10941 3.49168 7.02735 3.67925C6.94529 3.86681 6.8595 4.03514 6.76998 4.18424C6.68046 4.33334 6.5984 4.45958 6.5238 4.56299C6.4492 4.66639 6.37336 4.76378 6.29626 4.85516C6.21918 4.94654 6.12171 5.04947 6.00384 5.16393C5.88547 5.27791 5.82082 5.34044 5.80988 5.3515C5.79844 5.36208 5.74971 5.40152 5.66365 5.46981C5.57812 5.53858 5.48611 5.60736 5.38763 5.67614C5.28966 5.74443 5.19964 5.80143 5.11758 5.84711C5.03552 5.8928 4.93655 5.94498 4.82067 6.00366C4.70529 6.06282 4.58046 6.11765 4.44618 6.16815C4.3119 6.21865 4.17016 6.26554 4.02096 6.30882C3.87176 6.35211 3.72753 6.38578 3.58827 6.40982C3.44903 6.43387 3.29112 6.45431 3.11456 6.47114L2.84973 6.49639V6.5H2.36483V6.49639L2.30142 6.49279C2.25915 6.49038 2.22433 6.48797 2.19698 6.48557C2.16963 6.48317 2.06643 6.46994 1.88739 6.44589C1.70835 6.42185 1.56785 6.3978 1.4659 6.37375C1.36395 6.34971 1.21225 6.30401 1.01083 6.23668C0.809413 6.16935 0.637087 6.10129 0.493854 6.03252C0.351121 5.96422 0.261601 5.92094 0.225293 5.90266C0.189485 5.88487 0.149201 5.86275 0.10444 5.83629L0.0373001 5.79661L0.0358156 5.79445L0.0335701 5.79301L0.0313321 5.79156L0.0298401 5.7894L0.0223801 5.78579L0.0149201 5.78219L0.0134355 5.78002L0.01119 5.77858L0.00895204 5.77714L0.00746003 5.77497L0.00597548 5.77281L0.00373001 5.77137H0V5.75694L0.00746003 5.75838L0.0149201 5.76054L0.0484902 5.76415C0.0708703 5.76655 0.131796 5.77016 0.231261 5.77497C0.330733 5.77978 0.436412 5.77978 0.548312 5.77497C0.660213 5.77016 0.774605 5.75934 0.891474 5.74251C1.00835 5.72568 1.14636 5.69682 1.30551 5.65594C1.46466 5.61505 1.61087 5.56648 1.74416 5.51021C1.87695 5.45346 1.97144 5.41114 2.02764 5.38324C2.08334 5.35583 2.16838 5.30484 2.28277 5.2303L2.45435 5.11848L2.45584 5.11632L2.45808 5.11487L2.46033 5.11343L2.46181 5.11127L2.4633 5.1091L2.46554 5.10766L2.46779 5.10622L2.46927 5.10405L2.47673 5.10189L2.48419 5.10044L2.48568 5.09323L2.48792 5.08602L2.49017 5.08457L2.49165 5.08241L2.43197 5.0788C2.39219 5.0764 2.35364 5.07399 2.31634 5.07159C2.27904 5.06918 2.2206 5.05836 2.14103 5.03912C2.06146 5.01988 1.97567 4.99103 1.88366 4.95255C1.79165 4.91408 1.70213 4.86838 1.6151 4.81548C1.52807 4.76258 1.46515 4.71857 1.42636 4.68346C1.38807 4.64883 1.33833 4.59978 1.27716 4.53629C1.21648 4.47233 1.16376 4.40668 1.119 4.33934C1.07424 4.27202 1.03148 4.19433 0.990699 4.10633L0.928774 3.97503L0.925044 3.96421L0.921314 3.95339L0.919076 3.94617L0.917584 3.93896L0.928774 3.9404L0.939964 3.94256L1.02202 3.95339C1.07674 3.9606 1.16253 3.963 1.27939 3.9606C1.39627 3.9582 1.47709 3.95339 1.52185 3.94617C1.56661 3.93896 1.59396 3.93414 1.60391 3.93174L1.61883 3.92814L1.63748 3.92453L1.65613 3.92092L1.65762 3.91876L1.65986 3.91731L1.6621 3.91587L1.66359 3.91371L1.64867 3.9101L1.63375 3.90649L1.61883 3.90289L1.60391 3.89928L1.58899 3.89567C1.57904 3.89327 1.56164 3.88846 1.53677 3.88124C1.5119 3.87403 1.44476 3.84757 1.33535 3.80189C1.22594 3.7562 1.1389 3.71171 1.07424 3.66842C1.00943 3.62501 0.947626 3.57754 0.889235 3.5263C0.831047 3.47436 0.767145 3.40751 0.697513 3.32575C0.627888 3.24399 0.565724 3.149 0.511012 3.04079C0.456308 2.93257 0.415277 2.82917 0.387922 2.73058C0.360676 2.63256 0.3427 2.53235 0.334217 2.43119L0.320781 2.27969L0.328241 2.28113L0.335701 2.2833L0.343161 2.2869L0.350621 2.29051L0.358081 2.29412L0.365541 2.29772L0.481172 2.34822C0.558264 2.38189 0.653998 2.41075 0.768383 2.43479C0.882775 2.45884 0.951154 2.47207 0.973534 2.47447L1.0071 2.47808H1.07424L1.07276 2.47592L1.07051 2.47447L1.06828 2.47303L1.06678 2.47087L1.0653 2.4687L1.06305 2.46726L1.06082 2.46582L1.05932 2.46365L1.05186 2.46004L1.0444 2.45644L1.04292 2.45427L1.04067 2.45283L1.03844 2.45139L1.03694 2.44922L1.02948 2.44562L1.02202 2.44201L1.02054 2.43984C1.01905 2.43888 0.99766 2.42349 0.956376 2.39367C0.915592 2.36337 0.872823 2.32418 0.828063 2.27608C0.783303 2.22798 0.738543 2.17749 0.693783 2.12458C0.64894 2.07156 0.609 2.01483 0.574422 1.95505C0.539614 1.89493 0.502806 1.81846 0.464014 1.72564C0.425721 1.6333 0.396627 1.54023 0.376731 1.44645C0.356843 1.35266 0.345653 1.26008 0.343161 1.1687C0.340677 1.07732 0.343161 0.999168 0.350621 0.93424C0.358081 0.869312 0.373001 0.795965 0.395382 0.714206C0.417762 0.632448 0.450093 0.545877 0.492362 0.454495L0.555772 0.317425L0.559502 0.306604L0.563232 0.295782L0.565478 0.29434L0.566962 0.292175L0.568454 0.290011L0.570692 0.288568L0.572938 0.290011L0.574422 0.292175L0.575914 0.29434L0.578152 0.295782L0.580398 0.297225L0.581882 0.29939L0.583374 0.301554L0.585612 0.302997L0.589342 0.310211L0.593072 0.317425L0.595318 0.318868L0.596802 0.321032L0.697513 0.429245C0.764653 0.501387 0.844229 0.581948 0.936234 0.670921C1.02825 0.759894 1.07922 0.806065 1.08916 0.809434C1.09912 0.813279 1.11154 0.824338 1.12646 0.842619C1.14138 0.860417 1.19112 0.902981 1.27567 0.970311C1.36022 1.03764 1.47087 1.1158 1.60764 1.20477C1.74441 1.29375 1.89609 1.38152 2.0627 1.46809C2.22931 1.55466 2.40835 1.63281 2.59982 1.70255C2.7913 1.77229 2.92558 1.81798 3.00266 1.83962C3.07975 1.86127 3.21154 1.88892 3.39804 1.92259C3.58454 1.95625 3.72505 1.9779 3.81954 1.98751C3.91403 1.99713 3.97869 2.00266 4.0135 2.00411L4.06572 2.00555L4.06423 1.99473L4.06199 1.98391L4.04707 1.89373C4.03712 1.83361 4.03215 1.74944 4.03215 1.64123C4.03215 1.53302 4.04085 1.43322 4.05826 1.34184C4.07567 1.25046 4.10178 1.15788 4.13659 1.0641C4.1714 0.970311 4.20547 0.895038 4.23879 0.838291C4.27261 0.78202 4.31687 0.717814 4.37158 0.645671C4.42629 0.573529 4.49716 0.498985 4.58419 0.422031C4.67122 0.345077 4.77069 0.276542 4.88259 0.216426C4.99449 0.15631 5.09769 0.110615 5.19218 0.0793563C5.28668 0.0480971 5.36625 0.0276521 5.4309 0.0180355C5.49556 0.00841898 5.52788 0.00288568 5.52788 0.00144284Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Twitter</span>
</a>
<a href="#" class="share__item" data-code="tg">
<span class="share__item-icon share__item-icon--tg">
<svg width="10" height="7" viewBox="0 0 10 7" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.39589 3.04852C1.39589 3.04852 5.05491 1.51189 6.32392 0.9708C6.8104 0.754384 8.46012 0.0617918 8.46012 0.0617918C8.46012 0.0617918 9.22155 -0.241191 9.15809 0.494655C9.13692 0.797667 8.96773 1.85815 8.79854 3.00523C8.54472 4.62846 8.26976 6.40316 8.26976 6.40316C8.26976 6.40316 8.22746 6.90097 7.86791 6.98753C7.50836 7.0741 6.91613 6.68455 6.8104 6.59795C6.72577 6.53304 5.22411 5.5591 4.6742 5.08295C4.52614 4.9531 4.35695 4.6934 4.69533 4.39039C5.45676 3.67617 6.36622 2.78882 6.91613 2.2261C7.16995 1.96638 7.42374 1.36038 6.36622 2.09622C4.86456 3.15674 3.38403 4.15231 3.38403 4.15231C3.38403 4.15231 3.04561 4.36873 2.41111 4.17394C1.77657 3.97918 1.03631 3.71945 1.03631 3.71945C1.03631 3.71945 0.528726 3.39481 1.39589 3.04852Z" fill="white"/>
</svg>
</span>
<span class="share__item-text">Telegram</span>
</a>
<a href="#" class="share__item js-share-item-copy">
<span class="share__item-icon share__item-icon--copy">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.19922 5.40327C4.37217 5.63449 4.59283 5.8258 4.84622 5.96425C5.09962 6.10269 5.37982 6.18501 5.66783 6.20564C5.95584 6.22627 6.24492 6.18471 6.51546 6.08379C6.78599 5.98287 7.03166 5.82495 7.2358 5.62074L8.44399 4.41255C8.81079 4.03277 9.01375 3.52412 9.00917 2.99615C9.00458 2.46818 8.79281 1.96313 8.41946 1.58978C8.04611 1.21644 7.54106 1.00466 7.01309 1.00008C6.48512 0.995488 5.97647 1.19845 5.59669 1.56525L4.904 2.25392" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.81002 4.59658C5.63707 4.36536 5.41641 4.17404 5.16302 4.0356C4.90962 3.89716 4.62942 3.81483 4.34141 3.79421C4.0534 3.77358 3.76432 3.81514 3.49379 3.91605C3.22325 4.01697 2.97758 4.17489 2.77344 4.3791L1.56525 5.58729C1.19845 5.96707 0.995488 6.47572 1.00008 7.0037C1.00466 7.53167 1.21644 8.03672 1.58978 8.41006C1.96313 8.78341 2.46818 8.99518 2.99615 8.99977C3.52412 9.00436 4.03277 8.80139 4.41255 8.43459L5.10122 7.74592" stroke="black" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</span>
<span class="share__item-text">Скопировать ссылку</span>
</a>
</div>
</div>
</noindex>
</div>
<section class="container inset" data-banner="225284" data-source="213325" data-format="horizontal">
<div class="row">
<div class="col-lg-8 col-sm-12">
<div class="inset__wrapper" style="background-color: #cae3f9;">
<div class="inset__content">
<!-- <h2 class="inset__header">Бесплатный курс</h2>
-->
<p class="inset__description" style="color:#1e3a2b!important">
Python для всех
</p>
<p class="inset__text" style="color:#1e3a2b!important">
Вы освоите Python на практике и создадите проекты для портфолио — телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер — руководитель отдела разработки в «Сбере».
</p>
<a data-source="213325" data-banner="225284" href="https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_all_skillbox" class="inset__button article-advert-banner__link courseLink" target="_blank" style="color:#fff; background-color:#3d3bff" data-courseid="">Пройти бесплатно</a>
</div>
<div class="inset__image">
<img src="https://optim.tildacdn.com/tild6662-3838-4630-a136-393038343431/-/resize/123x/-/format/webp/device_1-2_1.png.webp" width="145" height="auto" alt="">
</div>
</div>
</div>
</div>
</section>
<div style="align-content: center; background-color: black; overflow: hidden;">
<noindex>
<div style="display: flex; align-items: center; justify-content: center; background-color: black; height: 60px; color: white; text-align: center">
Листая дальше, вы перейдете на страницу <a style="text-decoration: underline;" data-type="scroll" href="https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_scroll_skillbox">Python для всех: старт в IT с нуля</a>
</div>
<div class="iframe-wrapper" style="height: 100vh; transform: scale(0.5);">
<iframe id="test_iframe" scrolling="no" style="overflow: hidden;margin: 0 auto;display: block; width: 100%; height: 100%" src="https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_scroll_skillbox">
</iframe>
</div>
</noindex>
</div>
<script>
jQuery(document).ready(function($) {
$('footer.without-buttons').remove();
let iframeWrapper = $('.iframe-wrapper');
var check = false;
$(window).on('scroll', function() {
let iframeWrapperHeight = iframeWrapper.height();
let iframeWrapperOffset = iframeWrapper.offset().top - iframeWrapperHeight;
let scrollTop = $(window).scrollTop();
const {scrollHeight, clientHeight } = document.documentElement;
const maxScroll = scrollHeight - clientHeight;
const power = 1
const scale = (scrollTop / maxScroll) * power;
iframeWrapper.css('height', `${clientHeight}`)
if (scrollTop > iframeWrapperOffset) {
if(!check) {
document.dispatchEvent(new CustomEvent('articleAdvertBanner', {
detail: {
event: 'show',
id: 225782,
sourceId: 213325,
format: "new_banner"
}
}));
}
check = true;
iframeWrapper.css({'transform': `scale(${scale})`})
if (maxScroll === scrollTop || maxScroll === iframeWrapper.offset().top) {
redirect();
} else if (maxScroll <= scrollTop + 1 ) {
redirect();
}
}
function isNeedAddUtm(url)
{
if (typeof url !== 'string') {
return false;
}
var externalLinks = [
'freelancer.skillbox.ru',
'sale.skillbox.ru',
'course.skillbox.ru',
'interiordesign.skillbox.ru',
'iamwebdev.skillbox.ru',
'iammarketer.skillbox.ru',
'iamdesigner.skillbox.ru',
'live.skillbox.ru',
'b2b.skillbox.ru',
'highereducation.skillbox.ru',
'skillbox.ru/courses',
'skillbox.ru/sale',
'skillbox.ru/media'
];
for (var i = 0; i < externalLinks.length; i++) {
externalLinks[i] = escapeRegExp(externalLinks[i]);
}
var regexp = new RegExp('^http[s]?:\/\/(skillbox\.ru|' + escapeRegExp(window.location.host) + '|' + externalLinks.join('|') + ')\/(?!media/)[a-zA-Z0-9-_/]*');
return !!url.match(regexp);
}
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function redirect() {
document.dispatchEvent(new CustomEvent('articleAdvertBanner', {
detail: {
event: 'click',
id: 225782,
sourceId: 213325,
format: "new_banner"
}
}));
var page = window.location.href;
var $article = $('section[data-article-text]');
var pageId = $article.data('articleid');
if(pageId === undefined)
{
pageId = 0;
}
window.dataLayer.push({
'event': 'go_to_course',
'courseID': 225782,
'page': page,
'pageID': pageId
});
var link = "https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_scroll_skillbox";
if(isNeedAddUtm(link)) {
var urlSplit = link.split('?');
var urlBase = urlSplit[0] ? urlSplit[0] : '';
link = urlBase + '?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_banners_scroll_all_all_skillbox';
}
window.location.assign(link);
// var iframe = document.getElementById("test_iframe");
// var src = iframe.src;
// var document_frame = iframe.contentWindow.document.documentElement;
// var body = window.document.body.innerHTML;
// var title = iframe.contentWindow.document.head.title;
//
// window.history.pushState({
// "html": body,
// "pageTitle": title,
// "src": document.location.href
// }, '', src);
// window.addEventListener("popstate", function(e) {
// window.location.href = document.location;
// });
//
// document.documentElement.replaceWith(document_frame);
}
});
});
</script> </section>
<div class="article-banner" data-banner="225285" data-source="213325" data-format="vertical" data-type="vertical">
<div class="row">
<div class="col-sm-4 col-sm-12">
<a data-source="213325" data-banner="225285" href="https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_all_skillbox" class="inset__wrapper" style="background-color: #cae3f9; display: block; text-decoration: none; color: inherit;" target="_blank">
<div class="inset__content">
<div class="inset__image" style="text-align: center;">
<img src="https://optim.tildacdn.com/tild6662-3838-4630-a136-393038343431/-/resize/123x/-/format/webp/device_1-2_1.png.webp" width="250" height="135" alt="">
</div>
<p class="inset__description" style="color:#000!important; padding-bottom:13px;">
Учитесь Python бесплатно ➞
</p>
<p class="inset__text" style="color:#000!important">
Пройдите бесплатный курс по разработке на Python. Получите готовый план выхода на фриланс и полезный гайд по созданию резюме.
</p>
<div class="inset__button article-advert-banner__link" style="color:#fff; background-color:#3d3bff; display: inline-block;">Пройти курс</div>
</div>
</a>
</div>
</div> </div>
<a data-source="213325" data-banner="225282" target="_blank" href="https://bootcamp.skillbox.ru/python/?utm_source=media&utm_medium=banners&utm_campaign=all_all_media_banners_invite_bootcamp-617_all_all_skillbox" class="article-banner article-advert-banner__link" style="background-color: #cae3f9!important;" data-format="top" data-type="top">
<div class="article-banner__img">
<img src="https://optim.tildacdn.com/tild6662-3838-4630-a136-393038343431/-/resize/123x/-/format/webp/device_1-2_1.png.webp" alt="">
</div>
<span class="article-banner__title"><b>Бесплатный курс по разработке на Python ➞</b><br>
Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер — руководитель отдела разработки в «Сбере».
</span>
<span class="article-banner__link">Пройти курс</span> </a>
<div class="question">
<div class="container">
<div class="question__inner">
<div class="question__title">Понравилась статья?</div>
<a href="#" data-cur-url="/media/code/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi/"
class="question__btn js-modalLink" data-mfp-src="#modalAuth">Да</a>
</div>
</div>
</div>
</div>
<span
data-area="article-bottom"
data-current-url="/media/code/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi/"
data-id="213325">
</span>
</div>
<script type="application/ld+json">
{"@context":"http:\/\/schema.org","@type":"Article","url":"https:\/\/skillbox.ru\/media\/code\/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi\/","headline":"\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u00a0Python: \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u00a0\u0437\u0430\u0434\u0430\u0447\u0438","articleSection":"\u041a\u043e\u0434","articleBody":"\u0421\u0430\u043c\u043e \u0441\u043b\u043e\u0432\u043e\u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u00ab\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u00bb \r\n\u0437\u0432\u0443\u0447\u0438\u0442 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u043e, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438 \u043d\u0435\u0442. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c \u0432\u0430\u0441 \u0441 \u0438\u0445 \u043b\u043e\u0433\u0438\u043a\u043e\u0439 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c\u0438 \u0438 \u043d\u0430\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u0412 \u0445\u043e\u0440\u043e\u0448\u0435\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430.\r\n\r\n\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435:\r\n\r\n- \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f [ #stk-1 ] \r\n- \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a [ #stk-2 ] \r\n- \u041a\u0430\u043a \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a [ #stk-3 ] \r\n- \u041a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0418\u041b\u0418 \u043f\u0440\u0438 \r\n\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0435 [ #stk-4 ] \r\n- \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 Python: \u043c\u043e\u0434\u0443\u043b\u044c \r\nre \u0438 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u044b [ #stk-5 ] \r\n- \u0416\u0430\u0434\u043d\u044b\u0439 \u0438 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a [ #stk-6 ] \r\n- \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 [ #stk-7 ] \r\n----------------------\r\n\r\n\r\n\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\r\n\r\n\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0441\u043d\u043e\u0432\u0430 \u0432 \u0448\u043a\u043e\u043b\u0435, \r\n\u043d\u0430 \u0443\u0440\u043e\u043a\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438. \u0412\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0432\u0441\u0435\u043c \u0434\u0430\u0442\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 \u0432 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0438.\r\n\r\n\u041d\u043e \u0442\u0443\u0442 \u0432\u0430\u0441 \u043f\u043e\u0434\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435: \u0432\u0441\u0435 \r\n\u0434\u0430\u0442\u044b \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0433\u043b\u0430\u0432\u0430\u043c \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0430 \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043a\u0430\u0436\u0434\u0430\u044f. \u0427\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043a\u043d\u0438\u0433\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u0430\u043c \u043a\u0440\u0443\u043f\u0438\u0446 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u2014 \u0442\u0430\u043a\u043e\u0435 \u0441\u0435\u0431\u0435 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043c\u0438\u043d\u0443\u0442\u0430 \u043d\u0430 \u0441\u0447\u0435\u0442\u0443.\r\n\r\n\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0432\u044b \u2014 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0435\u0433\u043b\u0443\u043f\u044b\u0439 (\u043d\u0435 \u0437\u0440\u044f \u0436\u0435 \r\n\u043f\u043e\u0448\u043b\u0438 \u0432 IT), \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438:\r\n\r\n- \u0434\u0430\u0442\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0446\u0438\u0444\u0440\u0430\u043c\u0438: \u0430\u0440\u0430\u0431\u0441\u043a\u0438\u043c\u0438, \r\n\u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0433\u043e\u0434 \u0438 \u043c\u0435\u0441\u044f\u0446, \u0438 \u0440\u0438\u043c\u0441\u043a\u0438\u043c\u0438, \u0435\u0441\u043b\u0438 \u0432\u0435\u043a;\r\n- \u0443\u0447\u0435\u0431\u043d\u0438\u043a \u2014 \u043f\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0437\u0434\u043d\u0435\u0433\u043e \u0421\u0440\u0435\u0434\u043d\u0435\u0432\u0435\u043a\u043e\u0432\u044c\u044f \r\n\u0438 \u041d\u043e\u0432\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0434\u0430\u0442\u044b, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0430\u0431\u0441\u043a\u0438\u043c\u0438 \u0446\u0438\u0444\u0440\u0430\u043c\u0438, \u2014 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435;\r\n- \u043f\u043e\u0441\u043b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0445 \u0446\u0438\u0444\u0440 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0451\u0442 \u0441\u043b\u043e\u0432\u043e \u00ab\u0432\u0435\u043a\u00bb.\r\n\r\n\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0443\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \r\n\u041e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u043b\u0438\u0441\u0442\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0430\u0442\u044b \u0432 \u0441\u043c\u0430\u0440\u0442\u0444\u043e\u043d (\u0438\u043b\u0438 \u0441\u0435\u0431\u0435 \u043d\u0430 \u043f\u043e\u0434\u043a\u043e\u0440\u043a\u0443). \u0412\u0443\u0430\u043b\u044f: \u043f\u044f\u0442\u0451\u0440\u043a\u0430 \u0437\u0430 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044c \u0443 \u0432\u0430\u0441 \u0432 \u0434\u043d\u0435\u0432\u043d\u0438\u043a\u0435, \u0430 \u043f\u0440\u0435\u043c\u0438\u044f \u043e\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0437\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0443\u0447\u0451\u0431\u0443 \u2014 \u0432 \u043a\u0430\u0440\u043c\u0430\u043d\u0435.\r\n\r\n\u041f\u043e \u0442\u0430\u043a\u043e\u043c\u0443 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \u043e\u043d\u0438 \u0432\u0435\u0434\u0443\u0442 \u043f\u043e\u0438\u0441\u043a \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443. \u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u2014 \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.\r\n\r\n\u0417\u0430\u043f\u0438\u0448\u0435\u043c \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u0442 \r\n\u0432 \u0432\u0438\u0434\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (\u043e\u043d\u0438 \u0435\u0449\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Regular Expressions, \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e regex \u0438\u043b\u0438 regexp). \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a:\r\n\r\n(?:\\d{4})|(?:[IVX]+ \u0432\u0435\u043a)\r\n\r\n\u041f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438: regex \u2014 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \r\n\u0438 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u043c\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 Python. \u041f\u0440\u0438\u0447\u0451\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043e\u0447\u0435\u043d\u044c \u0441\u0445\u043e\u0436. \u0422\u0430\u043a \u0447\u0442\u043e, \u0432\u044b\u0443\u0447\u0438\u0432 \u0435\u0433\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0443\u0447\u0438\u0432\u0430\u044f\u0441\u044c. \u041f\u043e\u0435\u0445\u0430\u043b\u0438.\r\n\r\n\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a\r\n\r\n\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e regex \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u0430\u043a \u0432\u043f\u043e\u043b\u043d\u0435 \r\n\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u043e\u0432\u043e \u00ab\u0432\u0435\u043a\u00bb \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u043a\u0432 \u00ab\u0432\u00bb, \u00ab\u0435\u00bb \u0438 \u00ab\u043a\u00bb), \u0442\u0430\u043a \u0438 \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u044e\u0431\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u0443).\r\n\r\n\u0414\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \r\n\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445:\r\n\u0421\u0438\u043c\u0432\u043e\u043b \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \r\n\u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \r\n. \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u0440\u043e\u043c\u0435 \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\\n) \r\n H.llo, .orld\r\n\r\n20.. \u0433\u043e\u0434 Hello, world; Hallo, 2orld\r\n\r\n2022 \u0433\u043e\u0434, 2010 \u0433\u043e\u0434 \r\n[\u2026] \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445. \r\n\u0421\u0438\u043c\u0432\u043e\u043b\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c, \u0442\u0430\u043a \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0444\u0438\u0441 [abc123]\r\n\r\n[A-Z]\r\n\r\n[A-Za-z0-9]\r\n\r\n[\u0410-\u042f\u0401\u0430-\u044f\u0451] \u0430; 1\r\n\r\nB; T\r\n\r\nA; s; 1\r\n\r\n\u0410; \u0451 \r\n[^\u2026] \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u0440\u043e\u043c\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \r\n [^A-Za-z] \u0437, 4 \r\n^ \u041d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438 ^\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, 0 \r\n$ \u041a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438 \u0414\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f!$ 0 \r\n| \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0418\u041b\u0418. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \r\n\u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 [0-9]|[IVXLCDM] \u2014 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0446\u0438\u0444\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0431\u043e \u0430\u0440\u0430\u0431\u0441\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0440\u0438\u043c\u0441\u043a\u043e\u0439 5; V \r\n\\ \u042d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430 \\ \u0441\u0438\u043c\u0432\u043e\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0438\u043b\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \\A\\d\\w\\Z \u2014 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0443\u043a\u0432\u044b \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430 \u0432 \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b.\r\n\r\n\\[\\.\\] \u2014 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b \r\n\u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 0 \r\n\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 1. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \r\n\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u00ab\u0410\u00bb \u0438 \u00ab\u0430\u00bb \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 2. \u0411\u0443\u043a\u0432\u044b \u00ab\u0401\u00bb \u0438 \u00ab\u0451\u00bb \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442 \r\n\u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u00ab\u0410 \u2014 \u042f\u00bb \u0438 \u00ab\u0430 \u2014 \u044f\u00bb. \u0422\u0430\u043a \u0447\u0442\u043e, \u0437\u0430\u0434\u0430\u0432\u0430\u044f \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442, \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.\r\n\r\n\u041d\u0430 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \r\n\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u044b .^$*+? {}[]\\|() \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438, \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \\.\r\n\r\n\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, . \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \r\n\u0441\u0438\u043c\u0432\u043e\u043b, \u0430 \\. \u2014 \u0437\u043d\u0430\u043a \u0442\u043e\u0447\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0441\u043b\u0435\u0448, \u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a: \\\\.\r\n\r\n\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u043c\u0438 \r\n\u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u043d\u043e \u043f\u0440\u0438 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0440\u043e\u043b\u044c \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.\r\n\u0421\u0438\u043c\u0432\u043e\u043b \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \r\n\\d \u041b\u044e\u0431\u0430\u044f \u0446\u0438\u0444\u0440\u0430. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e [0-9] \r\n\\D \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u0440\u043e\u043c\u0435 \u0446\u0438\u0444\u0440\u044b. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \r\n\u0447\u0442\u043e [^0-9] \r\n\\w \u041b\u044e\u0431\u0430\u044f \u0431\u0443\u043a\u0432\u0430, \u0446\u0438\u0444\u0440\u0430 \u0438 \u043d\u0438\u0436\u043d\u0435\u0435 \u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \r\n \r\n\\W \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u0440\u043e\u043c\u0435 \u0431\u0443\u043a\u0432\u044b, \u0446\u0438\u0444\u0440\u044b \u0438 \u043d\u0438\u0436\u043d\u0435\u0433\u043e \r\n\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \r\n\\s \u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b (\u043f\u0440\u043e\u0431\u0435\u043b, \u043d\u043e\u0432\u0430\u044f \r\n\u0441\u0442\u0440\u043e\u043a\u0430, \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a\u0430\u0440\u0435\u0442\u043a\u0438 \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435) \r\n\\S \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u043a\u0440\u043e\u043c\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \r\n\\A \u041d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e ^ \r\n\\Z \u041a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a\u0438. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e $ \r\n\\b \u041d\u0430\u0447\u0430\u043b\u043e \u0438\u043b\u0438 \u043a\u043e\u043d\u0435\u0446 \u0441\u043b\u043e\u0432\u0430 \r\n\\B \u0421\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 \r\n\\n, \\t\\, \\r \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \r\n\u043d\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0442\u0430\u0431\u0443\u043b\u044f\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a\u0430\u0440\u0435\u0442\u043a\u0438 \r\n\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \\A, \\Z, \\b \u0438 \\B \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \r\n\u043d\u0435 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0430 \u043d\u0430 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.\r\n\r\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \\b[\u0410-\u042f\u0401\u0430\u044f\u0451]\\b \r\n\u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0431\u0443\u043a\u0432\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0438\u043b\u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f.\r\n\r\n\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \r\n\u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437. \u0427\u0438\u0441\u043b\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439 \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 regex \u0437\u0430\u0434\u0430\u044e\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432. \u041e\u043d\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c.\r\n\u0421\u0438\u043c\u0432\u043e\u043b \u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \r\n \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u0432\u043e\u0434\u0430 \r\n{} \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439, \u043c\u043e\u0436\u043d\u043e \r\n\u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0438\u043b\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \\d{4} \u2014 \u0446\u0438\u0444\u0440\u0430, \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u0434\u0440\u044f\u0434\r\n\r\n\\d{1,4} \u2014 \u0446\u0438\u0444\u0440\u0430, \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434\r\n\r\n\\d{2,} \u2014 \u0446\u0438\u0444\u0440\u0430, \u043e\u0442 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434\r\n\r\n\\d{,4} \u2014 \u0446\u0438\u0444\u0440\u0430, \u043e\u0442 0 \u0434\u043e 4 \u0440\u0430\u0437 \u043f\u043e\u0434\u0440\u044f\u0434 1243, 1876\r\n\r\n\r\n1, 12, 176, 1589\r\n\r\n\r\n\r\n22, 456, 988888\r\n\r\n\r\n5, 15, 987, 1234 \r\n? \u041e\u0442 \u043d\u0443\u043b\u044f \u0434\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \r\n\u0447\u0442\u043e {0,1} \\d? 0 \r\n* \u041e\u0442 \u043d\u0443\u043b\u044f \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e {0,} \r\n \\d* 0 \r\n+ \u041e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \r\n{1,} \\d+ 0 \r\n\r\n\r\n\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448\u0435 \r\n\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0430\u0442 \u043f\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u0438:\r\n\r\n(?:\\d{4})|(?:[IVX]+ \u0432\u0435\u043a)\r\n\r\n\u0412 \u043d\u0451\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \r\n\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043d\u043e \u043d\u0430\u0447\u0438\u043d\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u0430.\r\n\r\n- \\d{4} \u2014 \u0446\u0438\u0444\u0440\u0430, \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u0434\u0440\u044f\u0434\r\n- | \u2014 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0418\u041b\u0418\r\n- [IVX]+ \u0432\u0435\u043a \u2014 \u0441\u0438\u043c\u0432\u043e\u043b I, V \u0438\u043b\u0438 X, \u043e\u0434\u043d\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \r\n\u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439, \u043f\u0440\u043e\u0431\u0435\u043b, \u0441\u043b\u043e\u0432\u043e \u00ab\u0432\u0435\u043a\u00bb\r\n\r\n\u041f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 regex101.com . \u0410 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0438\u0451\u043c\u044b \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0435\u0448\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447.\r\n\r\n\u041a\u0430\u043a \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a\r\n\r\n\u0423\u0442\u043e\u0447\u043d\u0438\u043c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 regex.\r\n\r\n\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \r\n\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u0445 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439.\r\n\r\n\u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u043a \u0441\u0430\u043c\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u0442\u0435\u043a\u0441\u0442, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a.\r\n\r\n\u041d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \r\n\u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c. (\u0431\u0443\u043a\u0432\u0430 \u00ab\u043c\u00bb, \u0437\u0430\u0442\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b) \u0438 \u0442\u0435\u043a\u0441\u0442 \u00ab\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443\u00bb. \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a \u0442\u0435\u043a\u0441\u0442\u0443, \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u00ab\u043c\u0430\u00bb, \u00ab\u043c\u044b\u00bb \u0438 \u00ab\u043c\u0443\u00bb. \u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0443 \u00ab\u041c\u0430\u00bb \u043d\u0430\u0448\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435.\r\n\r\n\u0415\u0441\u0442\u044c \u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u0447\u0435\u043c \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430, \u2014 \r\n\u0433\u0440\u0443\u043f\u043f\u0430. \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e. \u0413\u0440\u0443\u043f\u043f\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0440\u0443\u0433\u043b\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438 (\u2026).\r\n\r\n\u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0442\u0443 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0443 \u00ab\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443\u00bb \r\n\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043a \u043d\u0435\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:\r\n\r\n(\\w)(\\w{3})\r\n\r\n\u041e\u043d\u043e \u0437\u043d\u0430\u0447\u0438\u0442: \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \r\n\u0433\u0440\u0443\u043f\u043f\u043e\u0439, \u0438 \u0437\u0430 \u043d\u0438\u043c \u0435\u0449\u0451 \u0442\u0440\u0438 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0442\u0430\u043a\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f\u043e\u0439. \u0418\u0442\u043e\u0433\u043e \u0432\u0435\u0441\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.\r\n\r\n\u0412 \u043d\u0430\u0448\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0434\u0451\u0442 \r\n\u0442\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f, \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u0438\u0442 \u0434\u0432\u0435 \u0433\u0440\u0443\u043f\u043f\u044b:\r\n\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u0413\u0440\u0443\u043f\u043f\u0430 1 \u0413\u0440\u0443\u043f\u043f\u0430 2 \r\n\u041c\u0430\u043c\u0430 \u041c \u0430\u043c\u0430 \r\n\u043c\u044b\u043b\u0430 \u043c \u044b\u043b\u0430 \r\n\u0440\u0430\u043c\u0443 \u0440 \u0430\u043c\u0443 \r\n\r\n\r\n\u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \r\n\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0432 \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0430\u0434\u0440\u0435\u0441, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0443\u043b\u0438\u0446\u044b, \u043d\u043e\u043c\u0435\u0440\u0430 \u0434\u043e\u043c\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440\u0430 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b. \u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0435\u0433\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u0438 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e.\r\n\r\n\u0413\u0440\u0443\u043f\u043f\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \r\n\u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u044b: (? P<name>\u2026)\r\n\r\n\u0412\u043e\u0442 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d, \u0438\u0449\u0443\u0449\u0438\u0439 \r\n\u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u0434\u0430\u0434\u0438\u043c \u0438\u043c\u0435\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430\u043c:\r\n\r\n?P<first_letter>\\w)(?P<rest_letters>\\w{3})\r\n\r\n\u0423\u0431\u0435\u0440\u0451\u043c \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0438\u0441\u043a\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0443:\r\n\r\n\\w{4}\r\n\r\n\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0442\u0435\u043a\u0441\u0442, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0438\u0449\u0435\u043c \r\n\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f: \u00ab\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435\u00bb.\r\n\r\n\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0449\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0445 \r\n\u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0434\u0440\u044f\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u0436\u0435 \u00ab\u043f\u0438\u043b\u043e\u00bb, \u00ab\u0440\u0430\u043c\u0435\u00bb, \u00ab\u0440\u0430\u0431\u043e\u00bb, \u00ab\u0442\u0430\u0435\u0442\u00bb, \u00ab\u043b\u0435\u0441\u043e\u00bb \u0438 \u00ab\u043f\u0438\u043b\u043a\u00bb.\u0417\u0430\u0434\u0430\u0447\u0430 0. \u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a \u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043b\u043e\u0432\u0430\r\n\r\n\u0418\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \r\n\u043e\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u00ab\u043c\u0430\u043c\u0430\u00bb, \u00ab\u043c\u044b\u043b\u0430\u00bb, \u00ab\u0440\u0430\u043c\u0443\u00bb \u0438 \u00ab\u043f\u0430\u043f\u0430\u00bb \u2014 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435.\r\n\r\n\r\n\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443\r\n\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u0438\u043c\u0432\u043e\u043b \\b.\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 regex \u043d\u0443\u0436\u043d\u043e \r\n\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0438\u0449\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438. \u041f\u043e\u0434 \u0448\u0430\u0431\u043b\u043e\u043d \\w{4} \u0432 \u0441\u043b\u043e\u0432\u0435 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u00ab\u0440\u0430\u0431\u043e\u00bb \u0438 \u00ab\u0442\u0430\u0435\u0442\u00bb, \u043d\u043e \u0438 \u00ab\u0430\u0431\u043e\u0442\u00bb, \u00ab\u0431\u043e\u0442\u0430\u00bb, \u00ab\u043e\u0442\u0430\u0435\u00bb. \u0418\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u0431\u044b \u044d\u0442\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0438\u0441\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u2014 \u0430 \u0432 regex \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f.\r\n\r\n\u041a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0418\u041b\u0418 \u043f\u0440\u0438 \r\n\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0435\r\n\r\n\u041d\u0435\u0440\u0435\u0434\u043a\u043e \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \r\n\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043b\u0438\u0431\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0418\u041b\u0418 \u043d\u0435 \u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443, \u0430 \u043a \u0446\u0435\u043b\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0430\u0442 \u043f\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u0438:\r\n\r\n(?:\\d{4})|(?:[IVX]+ \u0432\u0435\u043a)\r\n\r\n\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u043e\u0431\u043e\u043a \u043c\u044b \u0441\u043a\u0430\u0437\u0430\u043b\u0438: \u0432\u044b\u0434\u0430\u0439\u0442\u0435 \r\n\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u2014 \u043b\u0438\u0431\u043e \u0433\u043e\u0434, \u043b\u0438\u0431\u043e \u0432\u0435\u043a.\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435.? : \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \r\n\u0447\u0442\u043e \u043c\u044b \u043f\u0440\u043e\u0441\u0438\u043c regex \u043d\u0435 \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438? :, \u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u043d\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b.\r\n\r\n\u0412 Python \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \r\n\u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 re-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b\u0438 \u043b\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u043b\u0438 \u043d\u0435\u0442.\r\n\r\n\u0422\u0430\u043a\u0436\u0435 \u043a \u0433\u0440\u0443\u043f\u043f\u0430\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b. \r\n\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043c\u0435\u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u043e\u0438\u0434\u043e\u0432 \u0432 \u00ab\u0417\u0432\u0451\u0437\u0434\u043d\u044b\u0445 \u0432\u043e\u0439\u043d\u0430\u0445\u00bb \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443: \u0431\u0443\u043a\u0432\u0430 \u2014 \u0446\u0438\u0444\u0440\u0430 \u2014 \u0431\u0443\u043a\u0432\u0430 \u2014 \u0446\u0438\u0444\u0440\u0430.\r\n\r\n\u0412\u043e\u0442 \u0442\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0435\u0437 \u0433\u0440\u0443\u043f\u043f:\r\n\r\n[A-Z]\\d[A-Z]\\d\r\n\r\n\u0418 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441 \u043d\u0438\u043c\u0438:\r\n\r\n(?:[A-Z]\\d){2}\r\n\r\n\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c\u044b\u0435 \r\n\u0433\u0440\u0443\u043f\u043f\u044b \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438.\r\n\r\n\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 Python: \u043c\u043e\u0434\u0443\u043b\u044c re \u0438 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u044b\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \r\n\u0432 Python, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c re:\r\n\r\nimport re\r\n\r\n\u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c. \r\n\u0412\u043e\u0442 \u0438\u0445 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435.\r\n\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0415\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \r\n \u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \r\nre.match (pattern, string) \u0418\u0449\u0435\u0442 pattern \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \r\nstring \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Match-\u043e\u0431\u044a\u0435\u043a\u0442 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None \r\nre.search (pattern, string) \u0418\u0449\u0435\u0442 pattern \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \r\nstring \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Match-\u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435\u043c, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None \r\nre.finditer (pattern, string) \u0418\u0449\u0435\u0442 pattern \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \r\nstring \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \r\nre.findall (pattern, string) \u0418\u0449\u0435\u0442 pattern \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \r\nstring \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f\u043c\u0438 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 None \r\nre.split (pattern, string, [maxsplit=0]) \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \r\nstring \u043f\u043e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c pattern \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u2014 \u043d\u0435\u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \r\nre.sub (pattern, repl, string) \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 string \r\n\u0432\u0441\u0435 pattern \u043d\u0430 repl \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \r\nre.compile (pattern) \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \r\n\u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 re-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0449\u0435\u0442, \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Pattern-\u043e\u0431\u044a\u0435\u043a\u0442 0 \r\n\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0449\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438.\r\n\r\n\u0414\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 Python \r\n\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 r-\u0441\u0442\u0440\u043e\u043a\u0438 (\u0438\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0441\u044b\u0440\u044b\u043c\u0438, \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u043c\u0438). \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043a\u0430 \\ \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u043d\u043e \u0438 \u0432 \u0441\u0430\u043c\u043e\u043c Python \u0442\u043e\u0436\u0435.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \r\n\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0448\u0435\u0439, \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 r-\u0441\u0442\u0440\u043e\u043a\u0438. \u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a:\r\n\r\nr'...'re-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c Match-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\r\n\r\n\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445.re.match \r\n(pattern, string)\r\n\r\n\u041d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \r\n\u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a:\r\n\r\nprint (re.match (r'\u041c\u0430\u043c\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443')) >>> \r\n<re.Match object; span=(0, 4), match='\u041c\u0430\u043c\u0430'> print (re.match (r'\u043c\u044b\u043b\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443')) >>> None \r\n\r\n\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u00ab\u041c\u0430\u043c\u0430\u00bb \u043d\u0430\u0448\u0451\u043b \r\n\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u043b Match-\u043e\u0431\u044a\u0435\u043a\u0442. \u0421\u043b\u043e\u0432\u043e \u0436\u0435 \u00ab\u043c\u044b\u043b\u0430\u00bb, \u0445\u043e\u0442\u044f \u0438 \u0435\u0441\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f None.re.search (pattern, string)\r\n\r\n\u0418\u0449\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443:\r\n\r\nprint (re.search (r'\u041c\u0430\u043c\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443')) >>> \r\n<re.Match object; span=(0, 4), match='\u041c\u0430\u043c\u0430'> print (re.search (r'\u043c\u044b\u043b\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443')) >>> <re.Match object; span=(5, 9), match='\u043c\u044b\u043b\u0430'>\r\n\r\n\u041f\u0440\u0438 \u044d\u0442\u043e\u043c re.search \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \r\n\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0438\u0441\u043a, \u0438\u0445 \u0431\u043e\u043b\u044c\u0448\u0435. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u044d\u0442\u043e:\r\n\r\nprint (re.search (r'\u043c\u044b\u043b\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \r\n\u0435\u0449\u0451 \u0440\u0430\u0437 \u043c\u044b\u043b\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0434\u043e\u043c\u044b\u043b\u0430')) >>> <re.Match object; span=(5, 9), match='\u043c\u044b\u043b\u0430'>re.finditer (pattern, string)\r\n\r\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \r\n\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0446\u0438\u043a\u043b:\r\n\r\nresults = re.finditer (r'\u043c\u044b\u043b\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \r\n\u0435\u0449\u0451 \u0440\u0430\u0437 \u043c\u044b\u043b\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0434\u043e\u043c\u044b\u043b\u0430') print (results) >>> <callable_iterator object at 0x000001C4CDE446D0> for match in results: print (match) >>> <re.Match object; span=(5, 9), match='\u043c\u044b\u043b\u0430'> >>> <re.Match object; span=(32, 36), match='\u043c\u044b\u043b\u0430'> >>> <re.Match object; span=(54, 58), match='\u043c\u044b\u043b\u0430'>\r\n\r\n\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \r\n\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c Match-\u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f.\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438\r\n\r\n\u0412 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u0445 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \r\n\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u00ab\u041c\u0430\u043c\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0448\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f re.match:\r\n\r\n<re.Match object; span=(0, 4), match='\u041c\u0430\u043c\u0430'>\r\n\r\nspan \u2014 \u044d\u0442\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \r\n\u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043a\u0430\u043b\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0443.\r\n\r\nmatch \u2014 \u044d\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430. \r\n\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u0438\u043d\u043d\u0430\u044f, \u0442\u043e \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\r\n\r\n\u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \r\n\u043e\u0442 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432.group\r\n\r\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0443, \u0435\u0441\u043b\u0438 \u0435\u043c\u0443 \r\n\u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 0. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 0:\r\n\r\nmatch = re.match (r'\u041c\u0430\u043c\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print (match.group()) \r\n>>> \u041c\u0430\u043c\u0430 print (match.group(0)) >>> \u041c\u0430\u043c\u0430 print (match[0]) >>> \u041c\u0430\u043c\u0430\r\n\r\n\u0415\u0441\u043b\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u044b, \r\n\u0442\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u044b, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438:\r\n\r\nmatch = re.match (r'(\u041c)(\u0430\u043c\u0430)', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print \r\n(match.group(1)) print (match.group(2)) >>> \u041c >>> \u0430\u043c\u0430 print (match[1]) print (match[2]) >>> \u041c >>> \u0430\u043c\u0430 #\u041c\u0435\u0442\u043e\u0434\u043e\u043c group \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u043d\u0443\u0436\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f. print (match.group(1,2)) >>> ('\u041c', '\u0430\u043c\u0430')\r\n\r\n\u0415\u0441\u043b\u0438 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u044b, \u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \r\n\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 group \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:\r\n\r\nmatch = re.match (r'(?P<first_letter>\u041c)(?P<rest_letters>\u0430\u043c\u0430)', \r\n'\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print (match.group('first_letter')) print (match.group('rest_letters')) >>> \u041c >>> \u0430\u043c\u0430\r\n\r\n\u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0433\u0440\u0443\u043f\u043f\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \r\n\u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0442\u043e \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435:\r\n\r\n#\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 \u043e\u0434\u0438\u043d \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b, \r\n\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430. match = re.match (r'(\\w){4}', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print (match.group(0)) >>> \u041c\u0430\u043c\u0430 print (match.group(1)) >>> \u0430groups\r\n\r\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438:\r\n\r\nmatch = re.match (r'(\u041c)(\u0430\u043c\u0430)', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print \r\n(match.groups()) >>> ('\u041c', '\u0430\u043c\u0430')span\r\n\r\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0430 \r\n\u0438 \u043a\u043e\u043d\u0446\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 start, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u2014 end:\r\n\r\nmatch = re.search (r'\u043c\u044b\u043b\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443') print (match.span()) \r\n>>> (5, 9) print (match.start()) >>> 5 print (match.end()) >>> 9re-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0435\u0437 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 Match-\u043e\u0431\u044a\u0435\u043a\u0442\u0430re.findall (pattern, string)\r\n\r\n\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \r\nMatch-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f:\r\n\r\n#\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 0. match_list = re.findall (r'\\b\\w{4}\\b', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (match_list) >>> ['\u041c\u0430\u043c\u0430', '\u043c\u044b\u043b\u0430', '\u0440\u0430\u043c\u0443', '\u043f\u0430\u043f\u0430']\r\n\r\n\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c \r\n\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u044b. \u0422\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 \u0441 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438:\r\n\r\nmatch_list = re.findall (r'\\b(\\w{1})(\\w{3})\\b', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \r\n\u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (match_list) >>> [('\u041c', '\u0430\u043c\u0430'), ('\u043c', '\u044b\u043b\u0430'), ('\u0440', '\u0430\u043c\u0443'), ('\u043f', '\u0430\u043f\u0430')]re.split (pattern, string, [maxsplit=0])\r\n\r\n\u0410\u043d\u0430\u043b\u043e\u0433 \u043c\u0435\u0442\u043e\u0434\u0430 str.split. \u0414\u0435\u043b\u0438\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \r\n\u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443, \u0430 \u0441\u0430\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430:\r\n\r\n#\u041f\u043e\u0434\u0435\u043b\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0438 \u043f\u0440\u043e\u0431\u0435\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \r\n\u043d\u0435\u0451. split_string = re.split (r', ', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (split_string) >>> ['\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443', '\u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435', '\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.']\r\n\r\nre.split \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \r\nmaxsplit \u2014 \u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e maxsplit \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439:\r\n\r\n#\u041f\u0440\u0438\u0440\u0430\u0432\u043d\u044f\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 maxsplit \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435. split_string \r\n= re.split (r', ', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.', maxsplit=1) print (split_string) >>> ['\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443', '\u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.']\r\n\r\n\u0415\u0441\u043b\u0438 \u0432 re.split \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0433\u0440\u0443\u043f\u043f\u044b, \u0442\u043e \u043e\u043d\u0438 \r\n\u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0441\u043b\u043e\u0433 \u00ab\u043f\u0430\u00bb:\r\n\r\n#\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0431\u0443\u043a\u0432\u044b \u00ab\u043f\u00bb \u0438 \u00ab\u0430\u00bb \u0432 \u043e\u0434\u043d\u0443 \u0433\u0440\u0443\u043f\u043f\u0443. \r\nsplit_string = re.split (r'(\u043f\u0430)', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (split_string) >>> ['\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 ', '\u043f\u0430', '', '\u043f\u0430', ' \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.'] #\u041f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0431\u0443\u043a\u0432\u044b \u00ab\u043f\u00bb \u0438 \u00ab\u0430\u00bb \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b. split_string = re.split (r'(\u043f)(\u0430)', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (split_string) >>> ['\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 ', '\u043f', '\u0430', '', '\u043f', '\u0430', ' \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.']re.sub (pattern, repl, string)\r\n\r\n\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \r\n\u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u044f:\r\n\r\nnew_string = re.sub (r'\u041c\u0430\u043c\u0430', '\u0414\u043e\u0447\u043a\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \r\n\u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.') print (new_string) >>> \u0414\u043e\u0447\u043a\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443, \u0430 \u043f\u0430\u043f\u0430 \u0431\u044b\u043b \u043d\u0430 \u043f\u0438\u043b\u043e\u0440\u0430\u043c\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u0435\u0441\u043e\u043f\u0438\u043b\u043a\u0435.\r\n\r\n\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \r\n\u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0443\u043f\u043f. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u043c\u0435\u043d\u044b \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435 \u0441\u0442\u0440\u043e\u043a\u0443, \u0430 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u044b \u0432 \u0432\u0438\u0434\u0435 \\n. \u0422\u043e\u0433\u0434\u0430 \u043e\u043d \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u043d\u0430 \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u0435:\r\n\r\nnew_string = re.sub (r'(\\w+) (\\w+) (\\w+),', r'\\2 \\3 \\1 \u2013', '\u0411\u0435\u043d\u0434\u0435\u0440 \r\n\u041e\u0441\u0442\u0430\u043f \u0418\u0431\u0440\u0430\u0433\u0438\u043c\u043e\u0432\u0438\u0447, \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u041e\u041e\u041e \"\u0420\u043e\u0433\u0430 \u0438 \u043a\u043e\u043f\u044b\u0442\u0430\"') print (new_string) >>> \u041e\u0441\u0442\u0430\u043f \u0418\u0431\u0440\u0430\u0433\u0438\u043c\u043e\u0432\u0438\u0447 \u0411\u0435\u043d\u0434\u0435\u0440 \u2014 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440 \u041e\u041e\u041e \"\u0420\u043e\u0433\u0430 \u0438 \u043a\u043e\u043f\u044b\u0442\u0430\"re.compile (pattern)\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \r\n\u043a\u043e\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0451\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437. \u0415\u0451 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:\r\n\r\npattern = re.compile (r'\u041c\u0430\u043c\u0430') print (pattern.search ('\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \r\n\u0440\u0430\u043c\u0443')) >>> <re.Match object; span=(0, 4), match='\u041c\u0430\u043c\u0430'> print (pattern.sub ('\u0414\u043e\u0447\u043a\u0430', '\u041c\u0430\u043c\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443')) >>> \u0414\u043e\u0447\u043a\u0430 \u043c\u044b\u043b\u0430 \u0440\u0430\u043c\u0443\u0414\u0435\u043b\u0435\u043d\u0438\u0435 r-\u0441\u0442\u0440\u043e\u043a\r\n\r\n\u041d\u0435\u0440\u0435\u0434\u043a\u043e \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u043d\u0443\u0436\u043d\u043e \r\n\u0443\u0447\u0435\u0441\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438 \u043e\u043f\u0446\u0438\u0439, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442\u0441\u044f. \u0410 regex \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u043b\u0435\u0433\u043a\u043e, \u0447\u0442\u043e \u0443\u0436 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0445.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0438\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a, \r\n\u0432 Python r-\u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435. \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u043d\u0430\u0448\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0434\u0430\u0442 \u043f\u043e \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u0438:\r\n\r\nre.findall (r'(?:\\d{4})|(?:[IVX]+ \u0432\u0435\u043a)', text)\r\n\r\n\u0415\u0433\u043e \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \r\n\u0432\u0438\u0434\u0435:\r\n\r\nre.findall (r'(?:\\d{4})' r'|' r'(?:[IVX]+ \u0432\u0435\u043a)', text)\r\n\r\n\u0416\u0430\u0434\u043d\u044b\u0439 \u0438 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\r\n\r\n\u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \r\n\u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \\d{1,4}. \u041a\u0430\u043a \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0435\u0448\u0430\u044e\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0446\u0438\u0444\u0440 \u0438\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c, \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u0447\u0435\u0442\u044b\u0440\u0435? \u042d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432.\r\n\r\n\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u0441\u0435 \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \r\n\u0436\u0430\u0434\u043d\u044b\u043c\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u043e\u0434 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043c\u043e\u0433\u0443\u0442.\r\n\r\n\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \r\n\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0447\u0430\u0441\u0442\u044c \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u044d\u043c\u044b \u0412\u0435\u043d\u0435\u0434\u0438\u043a\u0442\u0430 \u0415\u0440\u043e\u0444\u0435\u0435\u0432\u0430 \u00ab\u041c\u043e\u0441\u043a\u0432\u0430 \u2014 \u041f\u0435\u0442\u0443\u0448\u043a\u0438\u00bb, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443:\r\n\r\n\u0424\u0440\u044f\u0437\u0435\u0432\u043e \u2014 61-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440..........64 61-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 \r\n65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440\u202668 65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434\u202671 \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434 \u2014 \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e........73 \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e \u2014 \u0414\u0440\u0435\u0437\u043d\u0430...............77 \u0414\u0440\u0435\u0437\u043d\u0430 \u2014 85-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440...........80\r\n\r\n\u041d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \r\n\u0432\u044b\u0434\u0435\u043b\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c:\r\n\r\n- \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b \u0438\u043b\u0438 \r\n\u0446\u0438\u0444\u0440\u044b (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \\w).\r\n- \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043b\u044e\u0431\u043e\u0439 \r\n\u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432: \u0431\u0443\u043a\u0432\u044b, \u0446\u0438\u0444\u0440\u044b, \u0437\u043d\u0430\u043a\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d .+).\r\n- \u041e\u043d \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0442\u043e\u0447\u043a\u0443, \u043f\u043e\u0441\u043b\u0435 \r\n\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0434\u043e \u0442\u0440\u0451\u0445 \u0446\u0438\u0444\u0440 (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \\.\\d{1,3}).\r\n\r\n\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \r\n\u043d\u0430\u0448\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:\r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media\r\n\r\n\u0427\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \r\n\u043e\u0434\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u0447\u0435\u043c \u0437\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b\u0438 \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442 \u0441\u0440\u0430\u0437\u0443? \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 \u0436\u0430\u0434\u043d\u043e\u0441\u0442\u0438 \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 +, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.\r\n\r\n\u0412 \u0438\u0442\u043e\u0433\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \\w \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \r\n\u0441 \u0431\u0443\u043a\u0432\u043e\u0439 \u00ab\u0424\u00bb \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u0448\u0430\u0431\u043b\u043e\u043d \\.\\d{1,3} \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u00ab.80\u00bb \u0432 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u0430 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c .+.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \r\n\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u044b\u043c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043d\u0430\u0445\u043e\u0434\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c ., \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c: \u00ab\u041f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0434 \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0447\u0430\u0441\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u0430?\u00bb\r\n\r\n\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \r\n\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 .. \u0410 \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e . \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f: \\.\\d{1,3}.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043b\u0435\u043d\u0438\u0432\u044b\u043c, \r\n\u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b ?. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043b\u0435\u043d\u0438\u0432\u044b\u043c \u043a\u0432\u0430\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 + \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0438:\r\n \r\n\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442: Skillbox Media\r\n\r\n\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \r\n\u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e re.findall, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e:\r\n\r\ncontent = '\u0424\u0440\u044f\u0437\u0435\u0432\u043e \u2014 61-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440..........64 61-\u0439 \r\n\u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440....68 65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434....71 \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434 \u2014 \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e........73 \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e \u2014 \u0414\u0440\u0435\u0437\u043d\u0430...............77 \u0414\u0440\u0435\u0437\u043d\u0430 \u2014 85-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440...........80' strings = re.findall (r'\\w.+?\\.\\d{1,3}', content) for string in strings: print (string) #\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. >>> \u0424\u0440\u044f\u0437\u0435\u0432\u043e \u2014 61-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440..........64 >>> 61-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440....68 >>> 65-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440 \u2014 \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434....71 >>> \u041f\u0430\u0432\u043b\u043e\u0432\u043e-\u041f\u043e\u0441\u0430\u0434 \u2014 \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e........73 >>> \u041d\u0430\u0437\u0430\u0440\u044c\u0435\u0432\u043e \u2014 \u0414\u0440\u0435\u0437\u043d\u0430...............77 >>> \u0414\u0440\u0435\u0437\u043d\u0430 \u2014 85-\u0439 \u043a\u0438\u043b\u043e\u043c\u0435\u0442\u0440...........80\r\n\r\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0437\u0430\u0434\u0430\u0447\u0438\r\n\r\n\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \r\n\u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0440\u0435\u0448\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443 \u0432\u0430\u0441 \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.\u0417\u0430\u0434\u0430\u0447\u0430 1. \u0417\u0430\u043c\u0435\u043d\u0430 \u0438\u043c\u0451\u043d \u0432 \u0441\u0443\u0434\u0435\u0431\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438\r\n\r\n\u041f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u043e\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0443\u0434\u0435\u0431\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438\u0437 \u043d\u0438\u0445 \r\n\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u2014 \u0444\u0430\u043c\u0438\u043b\u0438\u0438, \u0438\u043c\u0435\u043d\u0430 \u0438 \u043e\u0442\u0447\u0435\u0441\u0442\u0432\u0430. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0432 \u0424. \u0418. \u041e. \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0444\u0430\u043c\u0438\u043b\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0432\u043e\u0439\u043d\u0430\u044f.\r\n\r\n\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0438\u0442 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0424. \r\n\u0418. \u041e. \u043f\u043e\u0434\u0441\u0443\u0434\u0438\u043c\u043e\u0433\u043e \u043d\u0430 N.\u0412\u0432\u043e\u0434\r\n\r\n\u041f\u043e\u0434\u0441\u0443\u0434\u0438\u043c\u0430\u044f \u042d\u0432\u0435\u0440\u0442-\u041a\u043e\u043b\u043e\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0430 \u0415\u043b\u0438\u0437\u0430\u0432\u0435\u0442\u0430 \r\n\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432\u043d\u0430 \u0432 \u0441\u0443\u0434\u0435\u0431\u043d\u043e\u043c \u0437\u0430\u0441\u0435\u0434\u0430\u043d\u0438\u0438 \u0432\u0438\u043d\u0443 \u0438\u043d\u043a\u0440\u0438\u043c\u0438\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043b\u0430 \u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u043e\u0431\u044a\u0451\u043c\u0435 \u0438 \u0441\u0443\u0434\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e 14 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f 1876 \u0433\u043e\u0434\u0430, \u0431\u0443\u0434\u0443\u0447\u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0430\u043b\u043a\u043e\u0433\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043f\u044c\u044f\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0431\u0435\u0437\u044b\u0441\u0445\u043e\u0434\u043d\u043e\u0441\u0442\u0438, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u043f\u043e\u0437\u0432\u043e\u043d\u0438\u043b\u0430 \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0442\u0430\u0446\u0438\u043e\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430 \u0432 \u043f\u043e\u043b\u0438\u0446\u0438\u044e, \u0441\u043e\u043e\u0431\u0449\u0438\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0435\u0451 \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0435 \u044f\u043a\u043e\u0431\u044b \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u0431\u043e\u043c\u0431\u0430. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0438 \u043f\u043e\u043b\u0438\u0446\u0438\u0438, \u0441\u043a\u043e\u0440\u0430\u044f \u0438 \u043f\u043e\u0436\u0430\u0440\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0438\u043b\u0430, \u0447\u0442\u043e \u0431\u043e\u043c\u0431\u0430 \u2014 \u044d\u0442\u043e \u043e\u043d\u0430.\u0412\u044b\u0432\u043e\u0434\r\n\r\n\u00ab\u041f\u043e\u0434\u0441\u0443\u0434\u0438\u043c\u0430\u044f N \u0432 \u0441\u0443\u0434\u0435\u0431\u043d\u043e\u043c \u0437\u0430\u0441\u0435\u0434\u0430\u043d\u0438\u0438\u00bb \r\n\u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443.\r\n\r\n\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\r\n\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0435\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c\u0443\u044e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \r\n\u0433\u0440\u0443\u043f\u043f\u0443 \u0432\u0438\u0434\u0430 (? : \u2026)? , \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0444\u0430\u043c\u0438\u043b\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u0444\u0438\u0441\u0430.\r\n\r\n\u0420\u0435\u0448\u0435\u043d\u0438\u0435\r\n\r\n\r\n#\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e string \u0442\u0435\u043a\u0441\u0442 \r\n\u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u043c \u043f\u043e\u0438\u0441\u043a. print (re.sub (r'[\u0410-\u042f\u0401]\\w*' r'(?:-[\u0410-\u042f\u0401]\\w*)?' r'(?: [\u0410-\u042f\u0401]\\w*){2}', 'N', string))\u0417\u0430\u0434\u0430\u0447\u0430 2. \u041f\u043e\u0438\u0441\u043a \u0430\u0434\u0440\u0435\u0441\u043e\u0432\r\n\r\n\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \r\n\u0447\u0430\u0441\u0442\u0435\u0439: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u043b\u0438\u0446\u044b, \u043d\u043e\u043c\u0435\u0440 \u0434\u043e\u043c\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0443\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043b\u043e\u0432, \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0441 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b. \u041d\u043e\u043c\u0435\u0440 \u0434\u043e\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0431\u044f \u0431\u0443\u043a\u0432\u0443.\r\n\r\n\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \r\n\u00ab\u0423\u043b\u0438\u0446\u0430\u00bb, \u00ab\u0443\u043b\u0438\u0446\u0430\u00bb, \u00ab\u0423\u043b.\u00bb \u0438\u043b\u0438 \u00ab\u0443\u043b.\u00bb, \u043f\u0435\u0440\u0435\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0434\u043e\u043c\u0430 \u2014 \u00ab\u0434\u043e\u043c\u00bb \u0438\u043b\u0438 \u00ab\u0434.\u00bb, \u043f\u0435\u0440\u0435\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b \u2014 \u00ab\u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0430\u00bb \u0438\u043b\u0438 \u00ab\u043a\u0432.\u00bb. \u0422\u0430\u043a\u0436\u0435 \u043d\u043e\u043c\u0435\u0440 \u0434\u043e\u043c\u0430 \u0438 \u043d\u043e\u043c\u0435\u0440 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0435\u0444\u0438\u0441\u043e\u043c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432.\r\n\r\n\u0414\u0430\u043d \u0442\u0435\u043a\u0441\u0442, \u0432 \u043d\u0451\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432\u0441\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \r\n\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u0432\u0438\u0434\u0435 \u00ab\u041f\u0443\u0448\u043a\u0438\u043d\u0430 32-135\u00bb.\r\n\r\n\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \r\n\u0434\u043e\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0435 \u043d\u0430 \u0443\u043b\u0438\u0446\u0430\u0445, \u0430 \u043d\u0430 \u043f\u043b\u043e\u0449\u0430\u0434\u044f\u0445, \u043d\u0430\u0431\u0435\u0440\u0435\u0436\u043d\u044b\u0445, \u0431\u0443\u043b\u044c\u0432\u0430\u0440\u0430\u0445 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.\u0412\u0432\u043e\u0434:\r\n\r\n\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c!\r\n\r\n\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u0432\u044b\u0435\u0437\u0434\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \r\n\u0442\u0440\u0451\u0445-\u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0432 \u043e\u0444\u0438\u0441\u0435. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u044f\u0432\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0445, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0438\u0445 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u0437\u0434\u0438\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f.\r\n\r\n\u041f\u0435\u0442\u0440\u043e\u0432\u0443 \u041f. \u041f. \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u0432\u044b\u0435\u0445\u0430\u0442\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c \u0443\u043b. \u041a\u0443\u043b\u044c\u0442\u0443\u0440\u044b \r\n78 \u043a\u0432. 6, \u0443\u043b\u0438\u0446\u0430 \u041c\u0438\u0440\u0430 \u0434\u043e\u043c 12\u0411 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0430 144. \u0421\u043c\u0438\u0440\u043d\u043e\u0432\u0430 \u0421. \u0421. \u043f\u0440\u043e\u0441\u044f\u0442 \u043f\u043e\u0434\u044a\u0435\u0445\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443: \u0412\u043e\u0441\u044c\u043c\u043e\u0433\u043e \u041c\u0430\u0440\u0442\u0430 106-19. \u0411\u0435\u0437 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0439 \u043f\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0430\u0434\u0440\u0435\u0441\u043e\u0432: \u0443\u043b\u0438\u0446\u0430 \u0421\u0432\u043e\u0431\u043e\u0434\u044b 54 6, \u0423\u043b\u0438\u0446\u0430 \u0428\u0438\u0448\u043a\u0438\u043d\u0430 \u0434\u043e\u043c 9 \u043a\u0432. 15, \u0443\u043b. \u041b\u0435\u0440\u043c\u043e\u043d\u0442\u043e\u0432\u0430 18 \u043a\u0432. 93.\r\n\r\n\u0412\u0441\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438\u0437 \u0437\u0430\u044f\u0432\u043e\u043a, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \r\n\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0430.\u0412\u044b\u0432\u043e\u0434\r\n\r\n\u041a\u0443\u043b\u044c\u0442\u0443\u0440\u044b 78-6\r\n\r\n\u041c\u0438\u0440\u0430 12\u0411-144\r\n\r\n\u0412\u043e\u0441\u044c\u043c\u043e\u0433\u043e \u041c\u0430\u0440\u0442\u0430 106-19\r\n\r\n\u0421\u0432\u043e\u0431\u043e\u0434\u044b 54-6\r\n\r\n\u0428\u0438\u0448\u043a\u0438\u043d\u0430 9-15\r\n\r\n\u041b\u0435\u0440\u043c\u043e\u043d\u0442\u043e\u0432\u0430 18-93\r\n\r\n\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\r\n\r\n\r\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u044b, \u0447\u0442\u043e\u0431\u044b \r\n\u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435 regex \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0432\u0430\u043c \u0447\u0430\u0441\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u0432\u0430\u043c \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u043f\u043f\u044b.\r\n\r\n\u0420\u0435\u0448\u0435\u043d\u0438\u0435\r\n\r\n\r\n#\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e string \u0442\u0435\u043a\u0441\u0442 \r\n\u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u043c \u043f\u043e\u0438\u0441\u043a. pattern = re.compile (r'(?:[\u0423\u0443]\u043b(?:\\.|\u0438\u0446\u0430) )?' r'((?:[\u0410-\u042f\u0401]\\w+)(?: [\u0410-\u042f\u0401]\\w+)*)' r' (?:\u0434\u043e\u043c |\u0434\\. )?' r'(\\d+\\w?)' r'[ -](?:\u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0430 |\u043a\u0432\\. )?' r'(\\d+)') addresses = pattern.findall (text) for address in addresses: print (f'{address[0]} {address[1]}-{address[2]}')\r\n\r\n\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \r\n\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f. \u0427\u0442\u043e\u0431\u044b \u0432 \u043d\u0451\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443. \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043e\u0432\u0430\u043b\u044b \u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435. \u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0430\u0448 \u0448\u0430\u0431\u043b\u043e\u043d. \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u043e\u0447\u0435\u0440\u0447\u0435\u043d\u044b \u0433\u0440\u0443\u043f\u043f\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c.\r\n \r\n\u0418\u043d\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0430: \u041c\u0430\u0439\u044f \u041c\u0430\u043b\u044c\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Skillbox Media\u0417\u0430\u0434\u0430\u0447\u0430 3. \u041c\u0435\u0442\u043e\u0434 \u0414\u043e\u0432\u043b\u0430\u0442\u043e\u0432\u0430\r\n\r\n\u041f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u043e\u0433\u043e \r\n\u0441\u0442\u0438\u043b\u044f \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u044e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u0451\u043c\u044b \u0438 \u043d\u0435\u0443\u043a\u043e\u0441\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0421\u0435\u0440\u0433\u0435\u0439 \u0414\u043e\u0432\u043b\u0430\u0442\u043e\u0432 \u0441\u043b\u0435\u0434\u0438\u043b \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0432\u0430 \u0432 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0441 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0431\u0443\u043a\u0432\u044b.\r\n\r\n\u0414\u0430\u043d\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \r\n\u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043b\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0431\u0443\u043a\u0432\u0443. \u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u0438\u0445 \u043d\u0435\u0442, \u043e\u043d\u0430 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442: \u00ab\u041c\u0435\u0442\u043e\u0434 \u0414\u043e\u0432\u043b\u0430\u0442\u043e\u0432\u0430 \u0441\u043e\u0431\u043b\u044e\u0434\u0451\u043d\u00bb. \u0410 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c: \u00ab\u0412\u044b \u0440\u0430\u0441\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0421\u0435\u0440\u0433\u0435\u044f \u0414\u043e\u043d\u0430\u0442\u043e\u0432\u0438\u0447\u0430\u00bb.\r\n\r\n\u0412\u0430\u0436\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \r\n\u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u043a\u0430\u043a \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0439\u0442\u0435 re-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 flags=re.I \u0438\u043b\u0438 flags=re.IGNORECASE.\u0412\u0432\u043e\u0434\r\n\r\n\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u0445 \r\n\u0431\u0443\u043a\u0432.\r\n\r\n\u0410 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \r\n\u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0431\u0443\u043a\u0432\u0443.\r\n\r\n\u0410 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e: \u0441\u0438\u043c\u0432\u043e\u043b \u00ab\u0430\u00bb \r\n\u043e\u0434\u043d\u043e\u0431\u0443\u043a\u0432\u0435\u043d\u043d\u044b\u0439.\u0412\u044b\u0432\u043e\u0434\r\n\r\n\u041c\u0435\u0442\u043e\u0434 \u0414\u043e\u0432\u043b\u0430\u0442\u043e\u0432\u0430 \u0441\u043e\u0431\u043b\u044e\u0434\u0451\u043d\r\n\r\n\u0412\u044b \u0440\u0430\u0441\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0421\u0435\u0440\u0433\u0435\u044f \u0414\u043e\u043d\u0430\u0442\u043e\u0432\u0438\u0447\u0430\r\n\r\n\u0412\u044b \u0440\u0430\u0441\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0421\u0435\u0440\u0433\u0435\u044f \u0414\u043e\u043d\u0430\u0442\u043e\u0432\u0438\u0447\u0430\r\n\r\n\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\r\n\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u043e\u0432\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \r\n\u0441\u0438\u043c\u0432\u043e\u043b \\b.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 regex \u043d\u0435 \u0441\u0442\u0430\u0440\u0430\u043b\u043e\u0441\u044c \r\n\u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u043f\u0440\u043e\u043f\u0443\u0441\u043a.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \r\n\u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0443 \u0432 \u0432\u0438\u0434\u0435 \\1.\r\n\r\n\u0420\u0435\u0448\u0435\u043d\u0438\u0435\r\n\r\n\r\n#\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e string \u0442\u0435\u043a\u0441\u0442 \r\n\u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u043c \u043f\u043e\u0438\u0441\u043a. pattern = r'\\b(\\w)\\w*.*?\\b\\1' match = re.search (pattern, string, flags=re.I) if match is None: print ('\u041c\u0435\u0442\u043e\u0434 \u0414\u043e\u0432\u043b\u0430\u0442\u043e\u0432\u0430 \u0441\u043e\u0431\u043b\u044e\u0434\u0451\u043d') else: print ('\u0412\u044b \u0440\u0430\u0441\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0421\u0435\u0440\u0433\u0435\u044f \u0414\u043e\u043d\u0430\u0442\u043e\u0432\u0438\u0447\u0430')\u0417\u0430\u0434\u0430\u0447\u0430 4. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0434\u0430\u0442 \u0432 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0435\r\n\r\n\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u043c\u0443 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \r\n\u0438\u0449\u0435\u0442 \u0434\u0430\u0442\u044b \u0432 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0438: (? :\\d{4})|(? : [IVX]+ \u0432\u0435\u043a).\r\n\r\n\u041e\u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \r\n\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0431\u0438\u0442\u0432\u0435, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0446\u0438\u0444\u0440\u0430\u043c\u0438 \u043f\u043e\u0434\u0440\u044f\u0434.\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \r\n\u043e\u0431\u0440\u0430\u0442\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0433\u043e\u0434\u044b. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0438: 1400 \u0433\u043e\u0434, 1400 \u0433., 1400\u20131500 \u0433\u043e\u0434\u044b, 1400\u20131500 \u0433\u0433., (1400), (1400\u20131500).\r\n\r\n\u0427\u0442\u043e\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u0438 \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \r\n\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00ab\u0441 \u0442\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043f\u043e \u0442\u0430\u043a\u043e\u0439-\u0442\u043e \u0433\u043e\u0434\u00bb \u0438 \u00ab\u043c\u0435\u0436\u0434\u0443 \u0442\u0430\u043a\u0438\u043c-\u0442\u043e \u0438 \u0442\u0430\u043a\u0438\u043c-\u0442\u043e \u0433\u043e\u0434\u043e\u043c\u00bb.\r\n\r\n\r\n\r\n\u0412\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \r\n\u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0438 \u0441\u043a\u043e\u0431\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0445, \u0430 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0422\u0430\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0439\u043c\u0451\u0442, \u0447\u0442\u043e \u0432\u044b \u0438\u043c\u0435\u0435\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443.\u0412\u0432\u043e\u0434\r\n\r\n\u041d\u0430\u0447\u0430\u043b\u043e\u043c \u0420\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c 31 \u043e\u043a\u0442\u044f\u0431\u0440\u044f \r\n1517 \u0433. \u2014 \u0434\u0435\u043d\u044c, \u043a\u043e\u0433\u0434\u0430 \u041c\u0430\u0440\u0442\u0438\u043d \u041b\u044e\u0442\u0435\u0440 (1483\u20131546) \u043f\u0440\u0438\u0431\u0438\u043b \u043a \u0434\u0432\u0435\u0440\u044f\u043c \u0432\u0438\u0442\u0442\u0435\u043d\u0431\u0435\u0440\u0433\u0441\u043a\u043e\u0439 \u0417\u0430\u043c\u043a\u043e\u0432\u043e\u0439 \u0446\u0435\u0440\u043a\u0432\u0438 \u0441\u0432\u043e\u0438 \u00ab95 \u0442\u0435\u0437\u0438\u0441\u043e\u0432\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0441\u0442\u0443\u043f\u0438\u043b \u043f\u0440\u043e\u0442\u0438\u0432 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0439 \u041a\u0430\u0442\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0446\u0435\u0440\u043a\u0432\u0438. \u0420\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0445\u0432\u0430\u0442\u0438\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u044e \u0415\u0432\u0440\u043e\u043f\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e XVI \u0432\u0435\u043a\u0430 \u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u044b XVII \u0432\u0435\u043a\u0430. \u041e\u0434\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0438 \u043a\u0440\u043e\u0432\u0430\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0420\u0435\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u2014 \u0412\u0430\u0440\u0444\u043e\u043b\u043e\u043c\u0435\u0435\u0432\u0441\u043a\u0430\u044f \u043d\u043e\u0447\u044c \u0432\u043e \u0424\u0440\u0430\u043d\u0446\u0438\u0438, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0430\u044f \u0432 \u043d\u043e\u0447\u044c \u043d\u0430 24 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 1572 \u0433\u043e\u0434\u0430.\r\n\r\n\u0422\u043e\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0436\u0435\u0440\u0442\u0432 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \r\n\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e. \u041f\u043e\u0433\u0438\u0431\u043b\u0438 \u043f\u043e \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 2000 \u0433\u0443\u0433\u0435\u043d\u043e\u0442\u043e\u0432 \u0432 \u041f\u0430\u0440\u0438\u0436\u0435 \u0438 3000 \u2014 \u0432 \u043f\u0440\u043e\u0432\u0438\u043d\u0446\u0438\u044f\u0445. \u0413\u0435\u0440\u0446\u043e\u0433 \u0434\u0435 \u0421\u044e\u043b\u043b\u0438, \u0441\u0430\u043c \u0435\u0434\u0432\u0430 \u0438\u0437\u0431\u0435\u0436\u0430\u0432\u0448\u0438\u0439 \u0441\u043c\u0435\u0440\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0437\u043d\u0438, \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u043e 70 000 \u0436\u0435\u0440\u0442\u0432. \u0414\u043b\u044f \u041f\u0430\u0440\u0438\u0436\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f 1100 \u043f\u043e\u0433\u0438\u0431\u0448\u0438\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0412\u0430\u0440\u0444\u043e\u043b\u043e\u043c\u0435\u0435\u0432\u0441\u043a\u043e\u0439 \u043d\u043e\u0447\u0438.\r\n\r\n\u042d\u0442\u043e\u043c\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u0438\u0445, \r\n\u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u0434\u0448\u0438\u0435 \u0432 1570\u20131572 \u0433\u043e\u0434\u0430\u0445: \u0421\u0435\u043d-\u0416\u0435\u0440\u043c\u0435\u043d\u0441\u043a\u0438\u0439 \u043c\u0438\u0440\u043d\u044b\u0439 \u0434\u043e\u0433\u043e\u0432\u043e\u0440 (1570), \u0441\u0432\u0430\u0434\u044c\u0431\u0430 \u0433\u0443\u0433\u0435\u043d\u043e\u0442\u0430 \u0413\u0435\u043d\u0440\u0438\u0445\u0430 \u041d\u0430\u0432\u0430\u0440\u0440\u0441\u043a\u043e\u0433\u043e \u0438 \u041c\u0430\u0440\u0433\u0430\u0440\u0438\u0442\u044b \u0412\u0430\u043b\u0443\u0430 (1572) \u0438 \u043d\u0435\u0443\u0434\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u043f\u043e\u043a\u0443\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u043e \u0430\u0434\u043c\u0438\u0440\u0430\u043b\u0430 \u041a\u043e\u043b\u0438\u043d\u044c\u0438 (1572).\u0412\u044b\u0432\u043e\u0434\r\n\r\n['1517 \u0433.', '(1483\u20131546)', 'XVI \u0432\u0435\u043a', 'XVII \u0432\u0435\u043a', '1572 \u0433\u043e\u0434', \r\n'1570\u20131572 \u0433\u043e\u0434\u0430\u0445', '(1570)', '(1572)', '(1572)']\r\n\r\n\u0420\u0435\u0448\u0435\u043d\u0438\u0435\r\n\r\n\r\n#\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e string \u0442\u0435\u043a\u0441\u0442 \r\n\u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0434\u0451\u043c \u043f\u043e\u0438\u0441\u043a. pattern = re.compile (r'(?:\\(\\d{4}(?:-\\d{4})?\\))' r'|' r'(?:' r'(?:\\d{4}-)?\\d{4} ' r'(?:' r'(?:\u0433\u043e\u0434(?:\u044b|\u0430\u0445|\u043e\u0432)?)' r'|' r'(?:\u0433\u0433?\\.)' r')' r')' r'|' r'(?:[IVX]+ \u0432\u0435\u043a)') print (pattern.findall (string))\r\n\r\n\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0441\u043b\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \r\n\u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0432\u043e\u0442 \u0435\u0433\u043e \u0441\u0445\u0435\u043c\u0430:\r\n \r\n\u0418\u043d\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0430: \u041c\u0430\u0439\u044f \u041c\u0430\u043b\u044c\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Skillbox Media\r\n\r\n\r\n\r\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435:\r\n\r\n- \u041a\u0430\u043a \u0438\u0437\u0443\u0447\u0438\u0442\u044c Python \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e: \r\n\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \r\n- \u0422\u0435\u0441\u0442. \u041a\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u0442\u0435 \u0432\u044b \u2014 Java \u0438\u043b\u0438 \r\nPython? \r\n- \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u0437\u0430\u0447\u0435\u043c \r\n\u043e\u043d\u043e \u043d\u0443\u0436\u043d\u043e ","author":{"@type":"Person","name":"\u0418\u0432\u0430\u043d \u0421\u0442\u0443\u043a\u043e\u0432","url":"https:\/\/skillbox.ru\/media\/authors\/ivan-stukov\/"},"publisher":{"@type":"Organization","name":"Skillbox","logo":{"@type":"ImageObject","url":"https:\/\/skillbox.ru\/static\/images\/skillbox.png"}},"mainEntityOfPage":{"@type":"WebPage","url":"https:\/\/skillbox.ru\/media\/code\/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi\/"},"datePublished":"2022-10-05T07:12:00Z","dateModified":"2022-10-05T07:28:57Z","image":{"@type":"ImageObject","url":["https:\/\/248006.selcdn.ru\/main\/iblock\/f7f\/f7f218cc9d4ee7d76c2df297623a81e9\/401fd162292ba0a3c24ec0e4c40f11cb.png"]},"description":"\u0418\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0433\u0430\u0439\u0434 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043c\u043e\u0449\u043d\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a."}
</script><script data-skip-moving="true" id="FiMjZmipVK5U4ODg">if (window.relap) window.relap.ar('FiMjZmipVK5U4ODg');</script> </div>
<script>
window.Section_id = 10;
</script>
</div>
</main>
<footer class="without-buttons">
<div class="footer__wrapper container">
<div class="footer__firstgroup">
<section class="footer__contactbox">
<address class="footer__contacts">
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74951540915">8 (800) 500-05-22</a>
<span class="footer__phone-caption">Контактный центр</span>
</p>
<p class="footer__contacts-block">
<a class="footer__phone link" href="tel:+74952915987">+7(495) 291-59-87</a>
<span class="footer__phone-caption">Отдел заботы о пользователях</span>
</p>
<p class="footer__address"> Москва, Ленинский проспект, дом 6, строение 20</p>
</address>
<ul class="social-contacts footer__social">
<li>
<a class="social-contacts__item" href="https://vk.com/skillbox_education"
aria-label="Вконтакте">
<img src="/static/images/footer/soc_vk.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item"
href="https://www.youtube.com/channel/UC2FJq-Rr7v4SlKAoM7x0ZhA" aria-label="YouTube">
<img src="/static/images/footer/soc_tube.svg"/>
</a>
</li>
<li>
<a class="social-contacts__item" href="tg://resolve?domain=skillboxru"
aria-label="Telegram">
<img src="/static/images/footer/soc_tg.svg"/>
</a>
</li>
</ul>
<div class="footer__age-limit">
16+
</div>
</section>
<section class="footer__rewardbox">
<ul class="rewards footer__rewards">
<li>
<span class="rewards__item">
<img src="/static/images/footer/footer_runet.svg" alt=""/>
<span>Премии Рунета</span>
<span>2018, 2019, 2020</span>
</span>
</li>
</ul>
</section>
</div>
<section class="footer__linksbox">
<ul class="links__list links__list--courses">
<li class="links__item links__item--header">Все направления</li>
<li class="links__item"><a href="/code/?utm_source=media&utm_medium=button&utm_campaign=footerlink_code&utm_term=footer">Программирование</a></li>
<li class="links__item"><a href="/design/?utm_source=media&utm_medium=button&utm_campaign=footerlink_design&utm_term=footer">Дизайн</a></li>
<li class="links__item"><a href="/marketing/?utm_source=media&utm_medium=button&utm_campaign=footerlink_marketing&utm_term=footer">Маркетинг</a></li>
<li class="links__item"><a href="/management/?utm_source=media&utm_medium=button&utm_campaign=footerlink_management&utm_term=footer">Управление</a></li>
<li class="links__item"><a href="/games/?utm_source=media&utm_medium=button&utm_campaign=footerlink_gamedev&utm_term=footer">Игры</a></li>
<li class="links__item"><a href="/multimedia/?utm_source=media&utm_medium=button&utm_campaign=footerlink_multimedia&utm_term=footer">Мультимедиа</a></li>
<li class="links__item"><a href="/psychology/?utm_source=media&utm_medium=button&utm_campaign=footerlink_psychology&utm_term=footer">Психология</a></li>
<li class="links__item"><a href="/general-development/?utm_source=media&utm_medium=button&utm_campaign=footerlink_general-development&utm_term=footer">Общее развитие</a></li>
<li class="links__item"><a href="/engineering/?utm_source=media&utm_medium=button&utm_campaign=footerlink_engineering&utm_term=footer">Инженерия</a></li>
<li class="links__item"><a href="/english/?utm_source=media&utm_medium=button&utm_campaign=footerlink_english&utm_term=footer">Английский язык</a></li>
<li class="links__item"><a href="/other/?utm_source=media&utm_medium=button&utm_campaign=footerlink_other&utm_term=footer">Другое</a></li>
</ul>
<ul class="links__list links__list--about">
<li class="links__item links__item--header">О Skillbox</li>
<li class="links__item"><a href="/company/?utm_source=media&utm_medium=button&utm_campaign=footerlink_aboutskillbox&utm_term=footer">О Платформе</a></li>
<li class="links__item"><a href="/career/?utm_source=media&utm_medium=button&utm_campaign=footerlink_careercentr&utm_term=footer"> Центр карьеры</a></li>
<li class="links__item"><a href="/otzyvy/?utm_source=media&utm_medium=button&utm_campaign=footerlink_testimonials&utm_term=footer">Отзывы</a></li>
<li class="links__item"><a href="/contacts/?utm_source=media&utm_medium=button&utm_campaign=footerlink_skillboxcontacts&utm_term=footer">Контакты</a></li>
<li class="links__item"><a href="/jobs/?utm_source=media&utm_medium=button&utm_campaign=footerlink_jobs&utm_term=footer">Вакансии</a></li>
<li class="links__item"><a href="/teachers/?utm_source=media&utm_medium=button&utm_campaign=footerlink_school&utm_term=footer">Школа кураторов</a></li>
<li class="links__item"><a href="/sale/free/?utm_source=media&utm_medium=button&utm_campaign=footerlink_free&utm_term=footer">Бесплатно</a></li>
<li class="links__item"><a href="/media/topic/tests/?utm_source=media&utm_medium=button&utm_campaign=footerlink_tests&utm_term=footer">Онлайн-тесты</a></li>
</ul>
<ul class="links__list links__list--webinar">
<li class="links__item links__item--header">Вебинары</li>
<li class="links__item"><a href="https://live.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_webinars&utm_term=footer" target="_blank" rel="noopener">Все вебинары</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/playlists/?utm_source=media&utm_medium=button&utm_campaign=footerlink_playlists&utm_term=footer" target="_blank" rel="noopener">Плейлисты</a></li>
<li class="links__item"><a href="https://live.skillbox.ru/calendar/?utm_source=media&utm_medium=button&utm_campaign=footerlink_schedule&utm_term=footer" target="_blank" rel="noopener">Расписание</a></li>
</ul>
<ul class="links__list links__list--last">
<li class="links__item links__journal"><a href="/media/" target="_blank" rel="noopener">Медиа</a></li>
<li class="links__item"><a href="https://partners.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_partners&utm_term=footer" target="_blank" rel="noopener">Партнерская программа</a></li>
<li class="links__item"><a href="https://b2b.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_b2b&utm_term=footer" target="_blank" rel="noopener">Корпоративным клиентам</a></li>
<li class="links__item"><a href="https://career.skillbox.ru/?utm_source=media&utm_medium=button&utm_campaign=footerlink_employees&utm_term=footer" target="_blank" rel="noopener">Для работодателей</a></li>
</ul>
</section>
</div>
<div class="footer__underline container">
<span class="footer__copy">
© Skillbox, 2026 </span>
<div>
<span class="footer__oferta">
<a href="/oferta.pdf" target="_blank">Договор оферты</a>
</span>
<span class="footer__payment">
<a href="/payments/" target="_blank">Оплата</a>
</span>
<span class="footer__use-policy">
<a href="/terms_of_use.pdf" target="_blank">Правила пользования Платформой</a>
<a href="/privacy_policy.pdf" target="_blank">Политика конфиденциальности</a>
</span>
</div>
</div>
</footer>
<div class="cookies">
<p class="cookies__desc">
Пользуясь нашим сайтом, вы соглашаетесь с тем, что
<a href="https://skillbox.ru/privacy_policy.pdf" target="_blank" rel="noopener"
type="application/pdf">мы используем cookies</a> 🍪
</p>
<button type="button" class="cookies__button">
Окей
</button>
</div>
<div class="subscribe-popup subscribe">
<div class="subscribe-popup__spacer-mobile"></div>
<div class="subscribe-popup__row-content ">
<button class="subscribe__close"></button>
<div class="subscribe__content">
<div data-subscribe-popup-success class="hidden">
<h2 class="subscribe__header-success">Спасибо за подписку! Забирайте 5 бесплатных курсов:</h2>
<ul class="subscribe__list-block">
<li>Найти себя в IT за 5 дней</li>
<li>Как найти себя в дизайне в 2025 году</li>
<li>Интерьеры, мебель, ландшафт и декорирование</li>
<li>Интернет-маркетинг на практике</li>
<li>Бизнес-аналитик, продакт- и проджект-менеджер</li>
</ul>
<div class="subscribe__btns-el">
<a
target="_blank"
href="https://refer.id/?bot=skillbox_main_bot&platform=telegram&verbose_name=Skillbox&bot_avatar=https://designer.ftrcdn.com/uploads/bot_avatars/medium_54ab1ce8c393eb3df1474846ce0a0e2c.png&n=137050&c=9209&bc_number=890&?utm_source=media&utm_medium=&utm_campaign=all_all_media_banners_invite_sbornik-890_all_bot_skillbox"
class="subscribe__el-btn">Получить доступ</a>
</div>
</div>
<div data-subscribe-popup-content>
<h2 class="subscribe__header">У нас есть классные рассылки!</h2>
<form action="/media/code/regulyarnye-vyrazheniya-v-python-sintaksis-poleznye-funktsii-i-zadachi/" class="newsletter-form page-subscription__form3" data-type="popup">
<input type="hidden" name="action" value="subscribe">
<div class="subscribe__checkboxes"></div>
<div class="subscribe__email email_popup">
<input class="subscribe-form__input" type="text" name="email" placeholder="Email" >
<span class="subscribe-form__label-name">Электронная почта</span>
<button type="submit" class="popup-btn-click">Подписаться</button>
<span class="email__error">Поле необходимо заполнить</span>
</div>
<div class="subscribe-popup__checkbox-end">
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data>
<div class="subscribe__checkbox">
<input type="checkbox" name="agreements[PERS]" id="isCheckTrue" value="1" data-checkbox-personal-data-input>
<label for="isCheckTrue"><span>Я согласен на <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/privacy_policy/version-290425.pdf">обработку персональных данных</a></span></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
<div class="subscribe__bottom">
<span>Нажимая на кнопку, я соглашаюсь с <a target="_blank" href="https://skillbox.ru/legal-docs/skillbox/file/terms_of_use/version-300824.pdf">правилами пользования Платформой</a></span>
</div>
<div class="subscribe-popup__checkbox-item" data-checkbox-personal-data-two>
<div class="subscribe__checkbox subscribe__checkbox--end" >
<input type="checkbox" name="agreements[ADS]" id="isAdsCalls" value="1" checked="" data-checkbox-personal-data-input-two>
<label for="isAdsCalls">Я согласен <a target="_blank" href="https://skillbox.ru/legal-docs/chou/file/soglasie-na-poluchenie-reklamy.pdf">получать рекламу и звонки</a></label>
</div>
<span class="email__error">Нужно ваше согласие</span>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- src="/static/images/articles/subscribe-popup-img.png" -->
</div>
<div class="bg-modal-overlay bg-modal-overlay--transparent"></div>
<script data-skip-moving="true" id="popup__data--formatted">
$(".popup-btn-click").on("click" , function (){
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
let input = $(this).closest(".subscribe__email").find(".subscribe-form__input");
let inputValue = input.val();
if(emailPattern.test(inputValue)) {
(window["rrApiOnReady"] = window["rrApiOnReady"] || []).push(function() { rrApi.setEmail(inputValue);});
}
});
/*
window.popupData = {
"8": {
header: 'У нас есть классные рассылки про дизайн!!!',
category: 'Дизайн',
checkboxes: [
'Лучшие статьи про Дизайн',
'«Типографика без боли»'
]
},
"10": {
header: 'У нас есть классные рассылки про код',
category: 'Код',
checkboxes: [
'Лучшие статьи про Код и Людей кода',
'«Жизнь без багов»'
]
},
"18": {
category: 'Геймдев',
checkboxes: []
},
"21": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Бизнес',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"9": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Маркетинг',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"11": {
header: 'У нас есть классные рассылки про бизнес',
category: 'Управление',
checkboxes: [
'Лучшие статьи про Бизнес',
'«Цифровая жизнь»',
'«EdTech по полочкам»'
]
},
"17": {
category: 'Развитие',
checkboxes: []
},
"22": {
header: 'У нас есть классные рассылки про образование',
category: 'Образование',
checkboxes: [
'Лучшие статьи про Образование',
'«EdTech по полочкам»',
'«Мой успешный онлайн-курс»'
]
},
}
*/
window.popupData = {"header":"\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 - \u043d\u0430 \u043f\u043e\u0447\u0442\u0443!\u003Cbr\/\u003E\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438\u003Cbr\/\u003E\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 5 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432:","category":"\u041a\u043e\u0434","checkboxes":{"23":"\u041c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442","24":"\u041c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433","26":"\u041a\u043e\u0440\u043f. \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435","13":"\u0414\u0438\u0437\u0430\u0439\u043d","16":"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","15":"\u041e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","17":"\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0433\u0440","18":"\u041f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u044f, \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e"},"code":"code","scroll":true};
window.subscribePopupShow = 1;
</script>
<div class="copied">
<img src="/static/images/articles/done-circle.svg" alt="" class="copied__icon">
<p class="copied__text">
Ссылка скопирована
</p>
</div>
<!-- <style>@font-face{font-display:swap;font-family:Graphik;font-weight:500;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Medium.woff2) format("woff2")}@font-face{font-display:swap;font-family:Graphik;font-weight:700;font-style:normal;src:url(https://248006.selcdn.ru/Shared/fonts/GraphikLCTT-VA-Bold.woff2) format("woff2")}.universal-notice{box-sizing:border-box;text-decoration:none;display:none;min-height:48px;color:var(--banner-color);background-color:var(--banner-bg);overflow:hidden;font-family:Graphik,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-transition:opacity .25s ease-in-out;transition:opacity .25s ease-in-out}.universal-notice *{box-sizing:inherit}.universal-notice.universal-notice--active{display:block}.universal-notice--bitrix{z-index:1000}.universal-notice__wrapper{position:relative;-webkit-box-pack:start;justify-content:flex-start;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-left:12px;padding:4px 0}.universal-notice__title{position:relative;flex-shrink:0;width:132px;margin-right:27px;font-size:14px;line-height:20px;text-transform:uppercase}.universal-notice__timer{display:none;margin:0;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.universal-notice__button{flex-shrink:0;min-width:120px;padding:8px 12px;border-radius:25px;font-weight:500;font-size:12px;line-height:16px;color:#3925b7;text-align:center;text-transform:uppercase;background-color:#ffa6a6}@media (min-width:768px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:768px) and (max-width:0px){.universal-notice{min-height:72px}.universal-notice__wrapper{-webkit-box-pack:center;justify-content:center;height:72px;margin:0}.universal-notice__title{width:252px;margin-right:32px;margin-left:20px;font-size:24px;line-height:32px}.universal-notice__button{min-width:200px;margin-right:20px;padding:14px 36px;font-size:16px;line-height:20px}}@media (min-width:1280px) and (max-width:0px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}@media (min-width:1280px){.universal-notice__wrapper{padding:0}.universal-notice__title{width:unset;margin-right:76px}.universal-notice__timer{flex-shrink:0;margin-right:32px;font-weight:700;font-size:24px;line-height:32px}.universal-notice__timer.js-universal-notice-active{display:-webkit-box;display:flex}.universal-notice__days{margin-right:5px}}</style>-->
</body>
</html>