Содержание
30 примеров полезных регулярных выражений
Регулярные выражения — мощный инструмент, который должен быть в арсенале каждого разработчика. С их помощью можно находить совпадения в строках на основе довольно сложных шаблонах. Используя регулярные выражения при создании динамических веб-сайтов, разработчик экономит кучу времени.
Процесс разработки веб-приложений значительно отличается от разработки программного обеспечения, однако основные моменты при программировании одинаковы в обоих случаях, поэтому выгода от использования регулярных выражений будет видна всем.
Изучение регулярных выражений (regex) довольно сложный процесс, особенно для начинающих, но при правильном подходе, вы освоите чрезвычайно мощный и полезный инструмент.
Самым сложным этапом при обучении с нуля является понимание синтаксиса регулярных выражений. Чтобы не тратить время на написание своих собственных регулярных выражений, автор статьи собрал 30 различных примеров, которые чаще всего используются при работе над различными проектами. (?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$
Надежность пароля — довольно субъективное понятие, поэтому не существует универсального решения для проверки. Однако, приведенный выше пример регулярного выражения может стать хорошей отправной точкой, если вы не желаете придумывать выражение для проверки пароля с нуля.
Код цвета в шестнадцатеричном формате
\#([a-fA-F]|[0-9]){3, 6}Шестнадцатеричные коды цветов используются при веб-разработке очень часто. Это регулярное выражение может быть поможет сравнить: совпадает ли какая-либо строка с шаблоном шестнадцатеричного кода.
Проверка адреса электронной почты
/[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igmОдной из самых распространенных задач при разработке является проверка соответствия введенной пользователем строки формату адреса электронной почты. Существует множество различных вариантов выражений для решения этой задачи, автор этой статьи предлагает свой оригинальный вариант.
IP-адрес (v4)
/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/Как e-mail может использоваться для идентификации посетителя, так IP-адрес является идентификатором конкретного компьютера в сети. Приведенное регулярное выражение проверяет соответствие строки формату IP-адреса v4.
IP-адрес (v6)
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\. \s]*$ //соответствует фразе из 5 и более ключевых словЭто действительно полезные выражения для пользователей Google Analytics и инструмента для веб-мастеров. Ведь с помощью них можно отсортировать ключевые фразы, используемые посетителями при поиске по количеству слов, входящих в них.
Выражения могут проверять фразы, содержащие определенное количество слов (например, 5), а также фразы количество слов в которых более двух, трех и т.д. Одно из самых мощных выражений, используемое для сортировки данных аналитики.
Поиск валидной строки Base64 в PHP
\?php[ \t]eval\(base64_decode\(\'(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?){1}\'\)\)\;Если вы являетесь PHP-разработчиком, то иногда вам может понадобиться найти объект, закодированный в формате Base64. Указанное выше выражение может использоваться для поиска закодированных строк в любом PHP-коде.
Проверка телефонного номера
^\+?\d{1,3}?[- . (?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$Проверять даты сложно, потому что они могут быть представлены в различных форматах, в том числе содержащих и числа, и текст.
В PHP имеется отличная функция date(), но она не всегда подходит, ведь в нее может быть передана необработанная строка. Поэтому для проверки указанного формата даты нужно использовать приведенное выше регулярное выражение.
Совпадение строки с адресом видеоролика на YouTube
/http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/giНа протяжении нескольких лет на Youtube не меняется структура URL-адресов. Youtube является самым популярным видео хостингом в Интернет, благодаря этому, видео с Youtube набирают наибольший трафик.
Если вам необходимо получить ID какого-либо видеоролика с Youtube, воспользуйтесь приведенным выше регулярным выражением. Это наилучшее выражение, подходящее для всех вариантов URL-адресов на этом видео-хостинге. \s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.#]+[;]{1}
Ситуация, когда придется воспользоваться указанным регулярным выражением, может сложиться очень редко, но не факт что не сложится никогда
Этот код можно использовать когда будет необходимо «вытянуть» какое-либо CSS-правило из списка правил для какого-нибудь селектора.
Удаление комментариев в HTML
<!--(.*?)-->Если вам необходимо удалить все комментарии из блока HTML-кода, воспользуйтесь этим регулярным выражением. Чтобы получить желаемый результат, вы можете воспользоваться PHP-функцией preg_replace().
Проверка на соответствие ссылке на Facebook-аккаунт
/(?:http:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-]*)/Если вам необходимо узнать у посетителя вашего сайта адрес его странички в Facebook, попробуйте это регулярное выражение. Оно поможет вам проверить правильность указанного пользователем URL. .*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$
Несмотря на то, что Microsoft выпустил новый браузер Edge, многие пользователи до сих пор пользуются Internet Explorer. Веб-разработчикам часто приходится проверять версию этого браузера, чтобы учитывать особенности разных версий при работе над своими проектами.
Вы можете использовать это регулярное выражения в JavaScript-коде чтобы узнать какая версия IE (5-11) используется.
«Вытягиваем» цену из строки
/(\$[0-9,]+(\.[0-9]{2})?)/Цена какого-либо товара может быть указана в различных форматах: в ней могут встречаться запятые, знаки после запятой и символы валюты.
Указанное выше регулярное выражение учитывает различные форматы отображения цены, с его помощью вы сможете «вытянуть» цену из любой символьной строки.
Разбираем заголовки в e-mail
/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/iС помощью этого небольшого выражения вы сможете разобрать заголовок e-mail сообщения, чтобы извлечь оттуда список адресатов. ]*))/g
Вы можете составить свои собственные регулярные выражения для манипулирования результатами поиска по вашим запросам в поисковой системе Google. Например, знак плюс (+) добавляет дополнительные ключевые слова, а минус (-) означает, что слова должны быть проигнорированы и удалены из результатов.
Это довольно сложное выражение, но если разобраться как использовать его должным образом, приведенный код может стать основой для построения собственного алгоритма поиска.
Путь к пониманию регулярных выражений довольно труден, однако, если вы будете его придерживаться, результат вас не разочарует. Попробуйте использовать приведенные в статье регулярные выражения при создании своего веб-приложения. Таким образом вы сможете понять как работают выражения из примеров, приведенных в статье, в реальности.
Если у вас есть свои примеры полезных регулярных выражений, вы можете добавить их в качестве комментария к этой статье.
Почитать оригинал статьи
Шпаргалка по регулярным выражениям.
В примерах | by Evgeny Vladimirovich | NOP::Nuances of Programming
Evgeny Vladimirovich
·
Follow
Published in
·
5 min read
·
Jan 6, 2019
Регулярные выражения (regex или regexp) очень эффективны для извлечения информации из текста. Для этого нужно произвести поиск одного или нескольких совпадений по определённому шаблону (т. е. определённой последовательности символов ASCII или unicode).
Области применения regex разнообразны, от валидации до парсинга/замены строк, передачи данных в другие форматы и Web Scraping’а.
Одна из любопытных особенностей регулярных выражений в их универсальности, стоит вам выучить синтаксис, и вы сможете применять их в любом (почти) языке программирования (JavaScript, Java, VB, C #, C / C++, Python, Perl, Ruby, Delphi, R, Tcl, и многих других). Небольшие отличия касаются только наиболее продвинутых функций и версий синтаксиса, поддерживаемых движком.
Давайте начнём с нескольких примеров.
Якоря — ^ и $
^Привет соответствует строке, начинающейся с Привет -> тестпока$ соответствует строке, заканчивающейся на пока^Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушкиКвантификаторы — * + ? и {}
abc* соответствует строке, в которой после ab следует 0 или более символов c -> тестabc+ соответствует строке, в которой после ab следует один или более символов cabc? соответствует строке, в которой после ab следует 0 или один символ cabc{2} соответствует строке, в которой после ab следует 2 символа cabc{2,} соответствует строке, в которой после ab следует 2 или более символов cabc{2,5} соответствует строке, в которой после ab следует от 2 до 5 символов ca(bc)* соответствует строке, в которой после ab следует 0 или более последовательностей символов bca(bc){2,5} соответствует строке, в которой после ab следует от 2 до 5 последовательностей символов bcОператор ИЛИ — | или []
a(b|c) соответствует строке, в которой после a следует b или c -> тестa[bc] как и в предыдущем примереСимвольные классы — \d \w \s и .
\d соответствует одному символу, который является цифрой -> тест\w соответствует слову (может состоять из букв, цифр и подчёркивания) -> тест\s соответствует символу пробела (включая табуляцию и прерывание строки). соответствует любому символу -> тестИспользуйте оператор
.
с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.У операторов
\d
,\w
и\s
также есть отрицания ―\D, \W
и\S
соответственно.Например, оператор
\D
будет искать соответствия противоположенные\d
.\D соответствует одному символу, который не является цифрой -> тестНекоторые символы, например
^.
и$
вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
Скобочные группы ― ()
a(bc) создаём группу со значением bc -> тестa(?:bc)* оперетор ?: отключает группу -> тестa(?<foo>bc) так, мы можем присвоить имя группе -> тест
Этот оператор очень полезен, когда нужно извлечь информацию из строк или данных, используя ваш любимый язык программирования. Любые множественные совпадения, по нескольким группам, будут представлены в виде классического массива: доступ к их значениям можно получить с помощью индекса из результатов сопоставления.
Если присвоить группам имена (используя (?<foo>. используется как отрицание в выражении -> тест
Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту \
) теряют своё служебное значение, поэтому нам ненужно их экранировать.
Жадные и ленивые сопоставления
Квантификаторы ( * + {}
) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.
Например, выражение <.+>
соответствует <div>simple div</div>
в This is a <div> simple div</div> test
. Чтобы найти только тэг div
― можно использовать оператор ?
, сделав выражение «ленивым»:
<.+?> соответствует любому символу, один или несколько раз найденному между < и >, расширяется по мере необходимости -> тест
Обратите внимание, что хорошей практикой считается не использовать оператор .
), где предыдущий символ ― словесный (например, \w
), а следующий ― нет, либо наоборот, (например, это может быть начало строки или пробел).
\B
― соответствует несловообразующей границе. Соответствие не должно обнаруживаться на границе \b
.
\Babc\B соответствует, только если шаблон полностью окружён словами -> тест
Обратные ссылки — \1
([abc])\1 \1 соответствует тексту из первой захватываемой группы -> тест([abc])([de])\2\1 можно использовать \2 (\3, \4, и т.д.) для определения порядкового номера захватываемой группы -> тест(?<foo>[abc])\k<foo> мы присвоили имя foo группе, и теперь ссылаемся на неё используя ― (\k<foo>). Результат, как и в первом выражении -> тест
Опережающие и ретроспективные проверки — (?=) and (?<=)
d(?=r) соответствует d, только если после этого следует r, но r не будет входить в соответствие выражения -> тест(?<=r)d соответствует d, только если перед этим есть r, но r не будет входить в соответствие выражения -> тест
Вы можете использовать оператор отрицания !
d(?!r) соответствует d, только если после этого нет r, но r не будет входить в соответствие выражения -> тест(?<!r)d соответствует d, только если перед этим нет r, но r не будет входить в соответствие выражения -> тест
Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими:
- Валидация данных (например, правильно ли заполнена строка time)
- Сбор данных (особенно веб-скрапинг, поиск страниц, содержащих определённый набор слов в определённом порядке)
- Обработка данных (преобразование сырых данных в нужный формат)
- Парсинг (например, достать все GET параметры из URL или текст внутри скобок)
- Замена строк (даже во время написания кода в IDE, можно, например преобразовать Java или C# класс в соответствующий JSON объект, заменить “;” на “,”, изменить размер букв, избегать объявление типа и т.д.)
- Подсветка синтаксиса, переименование файла, анализ пакетов и многие другие задачи, где нужно работать со строками (где данные не должны быть текстовыми).
Перевод статьи Jonny Fox: Regex tutorial — A quick cheatsheet by examples
Regex tutorial — Краткая шпаргалка с примерами | Джонни Фокс | Учебник Factory Mind
Regex — Быстрая шпаргалка с примерами | Джонни Фокс | Заводской разум | Medium Опубликовано в
·
Чтение: 6 мин.
·
23 июня 2017 г. с!
Ознакомьтесь с моей статьей REGEX COOKBOOK о наиболее часто используемых (и наиболее востребованных) регулярных выражениях 🎉
Регулярные выражения (regex или regexp) чрезвычайно полезны в извлечение информации из любого текста путем поиска одного или нескольких совпадений определенного шаблона поиска (т. е. определенной последовательности…
Автор Джонни Фокс
2,4 тыс. подписчиков
· Редактор
CTO@F актерский разум
Другие работы Джонни Фокса и Factory Mind Топ-10 наиболее часто используемых (и наиболее востребованных) регулярных выражений
·4 минуты чтения·20 марта 2019 г.
Джонни Фокс
in
WebSocket + Node.js + Express — Шаг за шагом с использованием Typescript
Краткое пошаговое руководство по WebSocket, Node/Express и Машинопись.
·5 минут чтения·23 мая 2017 г. 3
Простой клиент Angular на основе блестящего RxJS WebSocketSubject
·2 минуты чтения·16 января 2018 г.
Jonny Fox
in
Angular + PDF + Forms = PDF Dynamic Reactive Forms
Динамическое создание формы (в частности, с использованием реактивного «варианта») создание любого PDF-файла, предоставленного с формой в Angular Reactive Form
·5 минут чтения · 2 февраля 2018 г.
Просмотреть все от Jonny Fox
Рекомендовано Medium
Jacob Bennett
в
9000 4
Используйте Git как старший инженер
Git — это мощный инструмент, который приятно использовать, когда вы знаете, как его использовать.
·Чтение через 4 мин·15 ноября 2022 г.
Александр Нгуен
in
Почему я постоянно терплю неудачу с кандидатами во время собеседований в Google…
Они не встречаются с баром.
·4 минуты чтения·13 апреля
Списки
Истории, которые помогут вам расти как разработчику программного обеспечения
19 историй·50 сохранений
Выбор персонала
317 рассказов·81 сохранение
Сомнатх Сингх
в
Кодирование перестанет существовать через 5 лет.
Вот почему
Те, кто не приспособятся, перестанут существовать.
·8 мин чтения·20 января
The PyCoach
в
Вы используете ChatGPT неправильно! Вот как опередить 99% пользователей ChatGPT
Освойте ChatGPT, изучив технику быстрого доступа.
·Чтение через 7 минут·17 марта
Мелих Юмак
в
Дорожная карта разработчика Nodejs на 2023 год
Изучите дорожную карту разработчика Nodejs на 2023 год. Пошаговое руководство о том, как стать разработчиком Nodejs, расширить свои знания в качестве разработчика Nodejs
· 7 минут чтения · 29 янв.
Hussein Nasser
Как стать хорошим бэкэнд-инженером (основы)
Я работаю бэкэнд-инженером более 18 лет и был свидетелем того, как технологии приходят и уходят, но одно всегда остается неизменным; Первый…
·11 мин чтения·3 декабря 2022 г.
См. дополнительные рекомендации
Статус
Карьера
Преобразование текста в речь
Регулярные выражения, понятные примеры | Джейсон Чонг
Один из самых недооцененных навыков, которым должен обладать любой аналитик данных при работе со строками Брайан Натанаэль на Unsplash
Это сообщение в блоге было рождено из-за моего собственного разочарования и избегания темы регулярных выражений (регулярных выражений) в течение длительного времени.
В течение нескольких месяцев я откладывал идею изучения регулярных выражений, потому что, будем честными, они могут выглядеть чрезвычайно устрашающе, особенно когда вы впервые сталкиваетесь с ними. Я имею в виду цепочку символов, связанных вместе, казалось бы, без какой-либо логики — ни у кого нет на это времени!
Только когда мне недавно дали задание на работе, связанное с извлечением элементов строки, я, наконец, оценил мощь регулярных выражений. И, как оказалось, на самом деле это не так уж и плохо, если вы понимаете основы.
Итак, в этой статье я объясню, что такое регулярные выражения, познакомлю с некоторыми основными символами регулярных выражений и, самое главное, продемонстрирую на нескольких практических примерах, как выполнять регулярные выражения с помощью языка программирования R. В частности, мы будем обсуждать концепцию захвата групп в регулярных выражениях.
Если вы больше увлекаетесь Python, вы можете найти версию кода для Python на моем GitHub здесь.
Регулярные выражения не являются ни библиотекой, ни языком программирования. Вместо этого регулярное выражение представляет собой последовательность символов, которая определяет шаблон поиска в любом заданном тексте (строке).
Текст может состоять практически из чего угодно: от букв до цифр, от пробелов до специальных символов. Пока строка следует некоторому шаблону, регулярное выражение достаточно надежно, чтобы иметь возможность захватить этот шаблон и вернуть определенную часть строки.
Теперь, прежде чем мы перейдем к мельчайшим деталям, я думаю, очень важно, чтобы мы сначала рассмотрели некоторые основы регулярных выражений.
Примеры, приведенные далее в этой статье, будут основываться на некоторых основных понятиях, показанных здесь, а именно: символы, группировки и квантификаторы.
Символы
- Экранирующий символ:
\
- Любой символ:
.
- Цифра:
\d
- Не цифра:
\D
- Символ слова:
\w
- Символ не слова:
\W 9 0235
- Пробел:
\s
- Нет пробел:
\S
- Граница слова:
\b
- Не граница слова:
\B
- Начало строки: 9]
- Либо или:
|
- Группа захвата:
( )
Квантификаторы
- 0 или более:
*
- 1 или более:
+ 9 0235
- 0 или 1:
?
- Точное количество символов:
{ }
- Диапазон количества символов:
{Минимум, Максимум}
Не волнуйтесь, если приведенные выше символы регулярного выражения не имеют для вас особого смысла — они просто служат ссылками для примеров, которые мы собираемся рассмотреть.
В этом разделе мы сосредоточимся на 6 различных примерах, которые, мы надеемся, укрепят ваше понимание регулярных выражений. Фактически, мы рассмотрим:
- 2 примера с цифрами (номер телефона и дата)
- 2 примера с буквами (имена и URL-адреса)
- 2 примера с цифрами и буквами (адрес электронной почты и адрес)
Прежде чем мы начнем, убедитесь, что пакет tidyverse установлен и загружен в вашу рабочую среду.
# Установить пакет tidyverse
install.packages("tidyverse")# Загрузить пакет tidyverse
library(tidyverse)
1. Номер телефона
Предположим, у нас есть фрейм данных phone, содержащий следующий список телефонных номеров:
Мы хотели бы разбить эти телефонные номера на 3 отдельных компонента: код города (первые 3 цифры), телефонный номер (следующие 3 цифры) и номер линии (последние 4 цифры).
Как мы видим, числовые шаблоны здесь не всегда согласуются, т. е. имеют несовместимые скобки, дефисы и пробелы. Однако с помощью регулярных выражений мы можем легко захватить числовые группы.
Во-первых, нам нужно определить шаблон регулярного выражения.
phone_pattern = ".?(\\d{3}).*(\\d{3}).*(\\d{4})"
Как именно мы это интерпретируем? Что ж, давайте пошагово, слева направо:
-
.?
0 или 1 символ для учета необязательных открывающих скобок -
(\\d{3})
3-значные символы (первая группа захвата, т. е. первые 3 цифры) -
.*
0 или более символов для учета дополнительные закрывающие скобки, дефис и символы пробела -
(\\d{3})
3-значные символы (вторая группа захвата, т. е. следующие 3 цифры) -
.*
0 или более символов для учета необязательных символов дефиса и пробела -
(\\d {4})
4-значные символы (третья группа захвата, т. е. последние 4 цифры)
Затем мы можем использовать функцию str_match для извлечения групп захвата с использованием определенного шаблона регулярного выражения и помещения их в отдельные столбцы фрейма данных.
phone$area_code = str_match(phone$original_number, phone_pattern)[ 2]
phone$exchange = str_match(phone$original_number, phone_pattern)[ 3]
phone$line_number = str_match(phone$original_number, phone_pattern)[ 4]
2. Date
Предположим, у нас есть другой фрейм данных с именем date, который состоит из дат с несовместимыми разделителями, и мы хотим извлечь дни, месяцы и годы.
Используя подход, очень похожий на тот, который мы только что видели с телефонными номерами, нам нужно сначала определить шаблон регулярного выражения, затем сопоставить шаблон с исходным столбцом даты и, наконец, создать новый столбец для каждой группы захвата.
Сначала определите шаблон регулярного выражения для дат.
date_pattern = "(\\d{2}).(\\d{2}).(\\d{4})"
Вот объяснение кода:
-
(\\d{2} )
2-значные символы (первая группа захвата, т. е. день) -
.
один символ для учета всех специальных символов -
(\\d{2})
2-значные символы (вторая группа захвата, т. е. месяц) -
.
один символ для учета всех специальных символов -
(\\d{4})
4-значные символы (третья группа захвата, т. е. год)
Теперь мы можем сопоставить шаблон и создать отдельные столбцы для дня, месяца и года.
date$day = str_match(date$original_date, date_pattern)[ 2]
date$month = str_match(date$original_date, date_pattern)[ 3]
date$year = str_match(date$original_date, date_pattern)[ 4]
3. Имена
До сих пор мы исследовали два примера строк, содержащих только цифры и специальные символы. Давайте теперь научимся захватывать слова и буквы.
Здесь у меня есть фрейм данных, названный именами, с фамилиями, титулами и именами людей.
Давайте разобьем их так, чтобы у каждого из них были свои отдельные столбцы.
name_pattern = "(\\w+),\\s(Mr|Ms|Mrs|Dr).?\\s(\\w+)"
И вот интерпретация:
-
(\\w+ )
1 или более символов слова (первая группа захвата, т. е. фамилия) -
,
символ запятой -
\\s
одиночный пробел -
(Mr|Ms|Mrs|Dr)
Mr, Ms, Mrs или Dr (вторая группа захвата, т.е. титул) -
.?
0 или 1 символ точки после заголовка -
\\s
одиночный пробел -
(\\w+)
1 или более символов слова (третья группа захвата, т. е. имя)
Теперь поместите их в отдельные столбцы.
имен $family_name = str_match(names$full_name, name_pattern)[ 2]
name$title = str_match(names$full_name, name_pattern)[ 3]
names$given_name = str_match(names$full_name, name_pattern)[ 4]
4. URL-адреса
Давайте посмотрим на другой пример строк со словами и буквами.
К этому моменту вы уже должны быть знакомы с процессом.
url_pattern = "(https?)://(www)?.?(\\w+).(\\w+)/?(\\w+)?"
Интерпретация:
-
(https?)
http или https (первая группа захвата, т. е. схема) -
://
специальная строка специальных символов -
(www)?
необязательный www (вторая группа захвата, т.е. поддомен) -
.?
0 или 1 символ точки -
(\\w+)
1 или более символов слова (третья группа захвата, т. е. домен второго уровня) -
.
один символ точки -
(\\w+)
1 или более символов слова (четвертая группа захвата, т. е. домен верхнего уровня) -
/?
0 или 1 символ обратной косой черты -
(\\w+)?
необязательный 1 или более символов слова (пятая группа захвата, т. е. подкаталог)
Разделив группы захвата на отдельные столбцы, получим:
url$schema = str_match(url$full_url, url_pattern)[ 2]
url$subdomain = str_match(url$full_url, url_pattern)[ 3]
url$second_level_domain = str_match(url$full_url, url_pattern)[ 4]
url$top_level_domain = str_match(url$full_url, url_pattern)[ 5]
url$subdirectory = str_match(url$full_url, url_pattern)[ 6]
5.
Адрес электронной почты
Используя полученные знания о регулярных выражениях, давайте теперь рассмотрим два последних примера строк, содержащих как буквы, так и цифры.
Предположим, у нас есть список адресов электронной почты во фрейме данных с именем email:
Теперь сгенерируйте шаблон регулярного выражения для соответствия имени пользователя, доменному имени и домену.
email_pattern = "([a-zA-Z0-9\\_\\-\\.]+)@([a-zA-Z]+).(.+)"
Давайте посмотрим поближе в регулярном выражении и расшифровать его значение.
-
([a-zA-Z0-9\\_\\-\\.]+)
1 или более строчных букв, прописных букв, цифр и специальных символов, включая подчеркивание, дефис и точку (первая группа захвата, т.е. имя пользователя) -
@
по символу -
([a-zA-Z]+)
1 или более строчных и прописных букв (вторая группа захвата, т. е. доменное имя) -
.
один символ точки -
(.+)
1 или более символов (третья группа захвата, т. е. домен)
Затем мы применяем этот шаблон регулярного выражения к списку адресов электронной почты:
email$username = str_match(email $full_email, email_pattern)[ 2]
email$domain_name = str_match(email$full_email, email_pattern)[ 3]
email$domain = str_match(email$full_email, email_pattern)[ 4]
6. Адрес
И, конечно, лучший пример я оставил напоследок. Этот пример идентичен тому, что я делал на работе.
Пытаясь воссоздать эту часть работы, здесь я составил фрейм данных, называемый адресом, с гипотетическими адресами. Цель состоит в том, чтобы получить номер дома, название улицы, пригород, штат и почтовый индекс.
Как обычно, сначала нужно определить шаблон регулярного выражения.
address_pattern = "(\\d*)\\s?(.+),\\s(.+)\\s([A-Z]{2,3})\\s(\\d{4} )"
И пояснение кода:
-
(\\d*)
0 или более цифр, потому что некоторые адреса не имеют номеров домов (первая группа захвата, т. е. номер дома) -
\\s?
0 или 1 символ пробела -
(.+)
1 или более символов (вторая группа захвата, например, название улицы) -
,
запятая -
\\s
один символ пробела 90 236 -
(.+)
1 или более символов (третья группа захвата, т.е. пригород) -
\\s
одиночный пробел -
([A-Z]{2,3})
2 или 3 прописные буквы (четвертая группа захвата, т.е. состояние) -
\\s
один пробел 90 236 -
(\\d{4})
4-значные символы (пятая группа захвата, т. е. почтовый индекс)
Сопоставляя этот шаблон со списком адресов, мы получаем:
address$house_number = str_match(address$full_address, address_pattern)[ , 2]
address$street_name = str_match(address$full_address, address_pattern)[ 3]
address$suburb = str_match(address$full_address, address_pattern)[ 4]
address$state = str_match(address$full_address, address_pattern)[ 5]
address$postcode = str_match(address$full_address, address_pattern)[ 6 ]
Я надеюсь, что с помощью 6 примеров, которые я продемонстрировал в этом сообщении блога, вы не только лучше поняли, как работают регулярные выражения, но, что более важно, оценили их гибкость в сопоставлении сложных шаблонов строк.