Регулярное выражение (RegEx) - Лена Капаца
Регулярное выражение (RegEx) by Лена Капаца Jan. 22, 2023 Основы

Регулярное выражение (реджекс, регулярка) – специальное сочетание символов, позволяющее компьютеру отыскивать текст, подходящий заданному набору правил. Регулярки часть используются не только для поиска определенного текста, но и для его обработки. Во время Конструирования признаков (Feature Engineering), то есть выделения определенных данных из исходных и не очень удобных, этот уникальный инструмент часто помогает понять, есть ли в тексте тот или иной смыслонесущий отрезок.

При первой попытке понять регулярные выражения многим кажется, что это какой-то инопланетный язык. Однако освоение регулярных выражений может сэкономить вам тысячи часов, если вы работаете с текстом или вам нужно анализировать большие объемы данных. Эта система взаимодействия с текстом применяется в BI-аналитике (например, при построении SQL-запроса) и в программировании (например, при переименовании объекта в редакторе VSCode).

Компания Google вообще создала свой стандарт регулярных выражений (Google Re2) и использует его повсеместно в своих продуктах: непосредственно поисковой системе, базе данных BigQuery, конструкторе чат-ботов Dialogflow и т.д.

Прекрасно поможет разобраться с устройством RegEx сервис ihateregex.io. Попробуем создать регулярное выражение, которое бы позволило выискивать почты. Вот наш текстовый Корпус (Corpus), с почтами и другими частями:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, geon@ihateregex.io sed do test@gmail.com  eiusmod tempor incididunt ut labore et mail@testing.com dolore magna aliqua. zenco@gmail.com Ut enim ad minim veniam, quis nostrud yzy.design@gmail.com exercitation ullamco laboris nisi ut aliquip xyxel@bk.ru ex ea commodo consequat. rybina.e@bk.ru aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.

Первое, что приходит на ум, когда видишь почты – это наличие собачки (@). С него и начнем конструировать регулярку:

Стоит помнить, что некоторые символы в мире RegEx интерпретируются нестандартно, однако собачка к ним не относится. Есть небольшой перечень токенов – символов, которые создатели "зарезервировали", чтобы исключать те или иные символы, обозначить диапазон возможных значений и т.д. На этом примере с email мы познакомимся с некоторыми из них.

Если вам довелось работать с регулярками, а сгенерированное выражение работает криво, не расстраивайтесь. Скорее всего, среда, в которой вы работаете, явно не указывает, какой стандарт RegEx использует, и потому небольшие расхождения путают карты. Только практика позволит преодолеть первичное разочарование от сложности системы. Однако экономия времени при обработке текста может стать прекрасным вознаграждением за усилия.

Что еще мы знаем о почте? Что после собачки идет доменное имя, состоящее из относительно скромного числа букв и цифр (на самом деле, не более 63).

Конечно, второй собачки в почте быть уже не может, так что исключим этот символ с помощью токена "исключить" – ^ (^@). Кстати, чтобы внедрить сами символы, зарезервированные под токены, используйте наклонную экранирующую черту (например, \\). Помимо собачки в доменном имени второго уровня (той части, где владелец сайта проявляет индивидуальность – gmail, bk, mail, google и т.д.), помимо собачки нельзя использовать еще:

Так что учтем все эти четыре вещи и положим их в одну группу с помощью квадратных скобок, запрещающих все, что внутри них. Токен-крышечка, кстати, исключит все, что внутри квадратных скобок:

Обратите внимание, как скромно этот обновленный паттерн [^@ \t\r\n] захватывает лишь один символ после собачки. А надо-то все до точки! Вот эту логику "все до точки" мы сейчас и добавим. Обратите внимание на серо-зеленую диаграмму в нижней части скриншота: она расшифровывает логику регулярки и здорово помогает.

С символом + все просто: он значит присоединение чего угодно. В нашем случае, присоединить предстоит точку. Однако есть нюанс: точка на языке RegEx – это обозначение любого символа. Просто вонзив . в наш паттерн, мы обучим отыскивать любой символ, а нам нужна именно точка. Так что экранируем ее, добавим токен "наклонная черта" (\.):

Неужто поломали регулярку?! Где-то берет, как нам надо, а где-то перебарщивает. Просто настало время добавить паттерн корневого домена (.com, .ru, .net и проч.). К нему применимы те же правила (нет собачек, табуляции, переноса строки, возврата каретки):

И снова излишняя скромность: паттерн захватил лишь по одному символу после точки. Квадратные скобки исключают всего пять, и захватывают минимальное число (то есть один) символов. Давайте зададим паттерну корневого домена длину. По современным стандартам вместо .net, .com и .ru может быть сочетание аж в 24 символа, но мы возьмем пять. Корневых доменов в один символ тоже не бывает, так что нас интересует диапазон от двух до пяти включительно {2, 5}:

Так-то лучше! Половина пути пройдена, вы тоже вспотели?

Осталось отловить первую часть до почты. Она может быть очень и очень длинной (почты бывают до 320 символов длиной!), так что закладывать ограничений числа символов не будем. Снова повторим паттерн "без собачек, пробелов, табуляции, переносов строки, каретки" и добавим после него знак плюса:

Вуаля! Даже те почты с точками выделены верно, как здорово! Попробуем смутить нашу регулярку и добавить почтоподобного мусора (@test, email@gmail) в наш текст:

Паттерн доказал свою жизнеспособность, и это прекрасно. Если вы почувствовали себя в мире RegEx увереннее, попробуйте потренироваться и добавить группе доменного имени второго уровня ограничение по длине (2 - 63 символа). Тогда паттерн станет еще совершеннее и сможет отличить почты от других длинных частей текста.

Что поделать еще? Удобочитаемый перечень спецсимволов – токенов можно найти в разделе Quick Reference еще одного онлайн-сервиса regex101.com.  Там вы узнаете, как искать только буквы алфавита, числа, НЕчисла, любое сочетание любой длины между символами и т.д.

Подари чашку кофе дата-сайентисту ↑

© Лена Капаца. Все права защищены.