Регулярное выражение (реджекс, регулярка) – специальное сочетание символов, позволяющее компьютеру отыскивать текст, подходящий заданному набору правил. Регулярки часть используются не только для поиска определенного текста, но и для его обработки. Во время Конструирования признаков (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
есть еще и пробел!)Так что учтем все эти четыре вещи и положим их в одну группу с помощью квадратных скобок, запрещающих все, что внутри них. Токен-крышечка, кстати, исключит все, что внутри квадратных скобок:
Обратите внимание, как скромно этот обновленный паттерн [^@ \t\r\n]
захватывает лишь один символ после собачки. А надо-то все до точки! Вот эту логику "все до точки" мы сейчас и добавим. Обратите внимание на серо-зеленую диаграмму в нижней части скриншота: она расшифровывает логику регулярки и здорово помогает.
С символом +
все просто: он значит присоединение чего угодно. В нашем случае, присоединить предстоит точку. Однако есть нюанс: точка на языке RegEx – это обозначение любого символа. Просто вонзив .
в наш паттерн, мы обучим отыскивать любой символ, а нам нужна именно точка. Так что экранируем ее, добавим токен "наклонная черта" (\.
):
Неужто поломали регулярку?! Где-то берет, как нам надо, а где-то перебарщивает. Просто настало время добавить паттерн корневого домена (.com, .ru, .net и проч.). К нему применимы те же правила (нет собачек, табуляции, переноса строки, возврата каретки):
И снова излишняя скромность: паттерн захватил лишь по одному символу после точки. Квадратные скобки исключают всего пять, и захватывают минимальное число (то есть один) символов. Давайте зададим паттерну корневого домена длину. По современным стандартам вместо .net, .com и .ru может быть сочетание аж в 24 символа, но мы возьмем пять. Корневых доменов в один символ тоже не бывает, так что нас интересует диапазон от двух до пяти включительно {2, 5}
:
Так-то лучше! Половина пути пройдена, вы тоже вспотели?
Осталось отловить первую часть до почты. Она может быть очень и очень длинной (почты бывают до 320 символов длиной!), так что закладывать ограничений числа символов не будем. Снова повторим паттерн "без собачек, пробелов, табуляции, переносов строки, каретки" и добавим после него знак плюса:
Вуаля! Даже те почты с точками выделены верно, как здорово! Попробуем смутить нашу регулярку и добавить почтоподобного мусора (@test
, email@gmail
) в наш текст:
Паттерн доказал свою жизнеспособность, и это прекрасно. Если вы почувствовали себя в мире RegEx увереннее, попробуйте потренироваться и добавить группе доменного имени второго уровня ограничение по длине (2 - 63 символа). Тогда паттерн станет еще совершеннее и сможет отличить почты от других длинных частей текста.
Что поделать еще? Удобочитаемый перечень спецсимволов – токенов можно найти в разделе Quick Reference еще одного онлайн-сервиса regex101.com. Там вы узнаете, как искать только буквы алфавита, числа, НЕчисла, любое сочетание любой длины между символами и т.д.
Подари чашку кофе дата-сайентисту ↑
© Лена Капаца. Все права защищены.