Пошаговое руководство по изучению регулярных выражений: руководство по использованию в реальной жизни

Раскрытие возможностей RegEx, а также его практических сценариев

Что такое регулярные выражения?

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

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

Почему вам следует изучать регулярное выражение?

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

Использование регулярного выражения упрощает поиск конкретной информации в тексте. Как только вы определите, что ищете, вы сможете легко вносить масштабные изменения, замены, удаления и другие корректировки текста.

Regex оказывается невероятно полезным в различных сценариях реальной жизни. Он удобен для одновременного переименования нескольких файлов, анализа журналов, подтверждения точности отправки форм, внесения значительных изменений в кодовую базу и проведения тщательного поиска.

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

Как и многие другие вещи в жизни, понимание регулярных выражений действительно приходит через практический опыт. Я рекомендую вам поэкспериментировать с регулярными выражениями при прочтении этой статьи.

Регулярное выражение: основы

Регулярное выражение — это, по сути, последовательность символов, следующая определенному шаблону. Помимо обычных символов (например, abc), существуют специальные символы (*, +, ? и т. д.), предназначенные для определенных целей. Вы также можете использовать группы символов для упрощения регулярных выражений.

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

Например, если вы хотите найти «Hello World», вам нужно, чтобы строка начиналась именно с «Hello», или она может начинаться по-другому? Между «Hello» и «World» должен быть только один пробел или их может быть больше? Могут ли после слова «Мир» быть другие символы или строка должна на этом заканчиваться? Хотите рассматривать прописные и строчные буквы отдельно? Это типы вопросов, на которые вам следует получить ответы, прежде чем вы начнете писать регулярное выражение.

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

Точное совпадение

Самая простая форма регулярного выражения предполагает сопоставление последовательности символов аналогично тому, что вы можете сделать с помощью Ctrl-F в текстовом редакторе.

Вверху вы заметите, сколько совпадений. А внизу есть объяснение, которое шаг за шагом показывает, чему соответствует регулярное выражение.

Набор символов

Наборы символов регулярных выражений позволяют сопоставить любой отдельный символ из набора символов. Этот выбор заключен в квадратные скобки [].

Например, B[au]g соответствует как Bag, так и Bug. В данном случае B и g являются константами, но между ними может быть либо a, либо u.

Теперь взгляните на объяснение:

Диапазоны совпадений в регулярном выражении:

Иногда вам может потребоваться сопоставить ряд символов, следующих по порядку, например, все заглавные английские буквы. Однако перечислять все 26 букв по отдельности было бы затруднительно.

Regex предоставляет решение через диапазоны. Символ - действует как оператор диапазона. Вот несколько примеров допустимых диапазонов:

Вы также можете указать частичные диапазоны. Например, [b-e] соответствует любой букве «b», «c», «d» или e. Аналогично, [3-6] соответствует любому из чисел 3,4,55 или 6.

При определении набора символов вы не ограничены одним диапазоном. Вы можете включить несколько диапазонов и даже смешивать их с другими символами. Например, [1-5a-k] будет соответствовать любому из символов от 1 до 5 и от a до k.

Соответствующие символы не входят в набор:

Когда вы начинаете набор с символа ^, происходит обратное. Например, [A-Z0-9] будет соответствовать всему, кроме заглавных букв и цифр.

Классы символов:

При создании регулярного выражения вам часто приходится неоднократно сопоставлять определенные группы, например цифры. Возможно, вам даже придется сделать это несколько раз в одном и том же выражении.

Например, подумайте, как бы вы сопоставили такой шаблон, как «буква-цифра-буква-цифра».

Используя то, что вы узнали до сих пор, вы можете создать

[a-zA-Z]-[0–9]-[a-zA-Z]-[0–9].

Это работает, но вы можете себе представить, насколько сложным станет выражение по мере того, как шаблон станет длиннее.

Чтобы упростить задачу, в регулярном выражении есть предопределенные классы для общих групп символов, таких как цифры. В таблице ниже показаны эти классы и их эквивалентные выражения с использованием наборов символов:

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

Обычно нас может не интересовать каждая отдельная позиция в паттерне. Здесь нам пригодится класс ., поскольку он избавляет нас от необходимости перечислять все возможные символы в наборе.

Например, t.. соответствует всему, что начинается с t и за которым следуют любые два символа. Это может напомнить вам оператор SQL LIKE, который использует t%% для достижения аналогичного результата.

Кванторы

При работе с шаблонами часто в игру вступает повторение. Например, если вы хотите сопоставить трехзначное число, вы можете использовать\d\d\d. Но что, если вам нужно сопоставить 11 цифр? Набирать \d одиннадцать раз довольно утомительно. В программировании, включая регулярные выражения, хорошим правилом является избегать чрезмерного повторения.

Вот тут-то и пригодятся квантификаторы в регулярных выражениях. Вместо того, чтобы писать одно и то же несколько раз, вы можете использовать квантификаторы. Чтобы сопоставить 11 цифр, вы можете просто использовать выражение \d{11} .

В следующей таблице представлены квантификаторы, доступные для использования в регулярном выражении:

В этом случае выражение can\s+write находит вхождения can, за которым следует один или несколько пробелов, а затем write. Однако обратите внимание, что canwrite не считается совпадением, поскольку для \s+ требуется наличие хотя бы одного пробела. Эта функция особенно полезна при поиске по необрезанному тексту.

Сможете ли вы угадать, чему будет соответствовать can\s?write?

Группы захвата

Группы захвата подобны меньшим частям более крупного выражения, которые вы помещаете в круглые скобки (). У вас может быть много групп захвата, и они могут даже находиться внутри друг друга.

Например, выражение (The ){2} соответствует «The» два раза. Но если группы захвата нет, выражение The {2} будет соответствовать «The», за которым следуют 2 пробела, поскольку правило подсчета применяется к символу пробела, а не ко всему «The» как группе.

Вы можете поместить любой шаблон в группы захвата, как и обычное регулярное выражение. Например, (is\s+){2} соответствует, если обнаруживает, что за словом «is» следует один или несколько пробелов, встречающихся дважды.

Использование логического ИЛИ в регулярном выражении

Вы можете использовать «|» для соответствия различным рисункам. Например, (good|bad|sweet)соответствует фразе «Это», за которой следует good, bad или sweet.

Опять же, вы должны понимать важность групп захвата. Подумайте, чему соответствует выражение You are good|bad|sweet?

При использовании группы захвата, например (хороший|плохой|сладкий), соответствие «хороший», «плохой» или «сладкий» отделяется от предшествующего «Это». Однако, если оно не входит в группу захвата, все регулярное выражение рассматривается как одна группа. Следовательно, выражение «Это хорошо|плохо|сладко» будет соответствовать строке, если оно содержит «Это хорошо», «плохо» или «сладко».

Как использовать ссылки на группы захвата

На группы захвата можно ссылаться в одном и том же выражении или при замене, как показано в разделе «Замена».

Большинство инструментов и языков программирования позволяют ссылаться на захваченную группу с помощью «\n», где «n» представляет порядок группы. На этом веб-сайте «$n» используется для ссылки во время замены. Синтаксис замены может отличаться в зависимости от используемых вами инструментов или языка. Например, в JavaScript это «$n», а в Python — «\n».

В выражении You(This) is \1 power группа, фиксирующая «Это», обозначается как «\1», что фактически соответствует This is This power .

Как давать имена группам захвата

Вы можете назначить имена группам захвата, используя формат (?<name>pattern), а затем обращаться к ним позже в том же выражении с is\k<name> .

Во время замены ссылка достигается с помощью $<name> в синтаксисе JavaScript, хотя это может различаться в зависимости от языка программирования. Имейте в виду, что эта функция может быть доступна не на всех языках.

В выражении:

(?<lang>[\w+]+) is the best but \k<lang>.*

шаблон [\w+]+ фиксируется под названием «lang», а позже упоминается как \k<lang>. Этот шаблон соответствует одному или нескольким символам слова или символу «+». .* в конце соответствует любому символу ноль или более раз. При замене ссылка осуществляется с помощью a$<lang>.

Как использовать регулярное выражение с инструментами командной строки

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

Известные инструменты в этой области включают grep, sed и awk. Ниже я приведу несколько примеров, чтобы дать представление о том, как можно максимально эффективно использовать эти инструменты.

Рекурсивный поиск по регулярным выражениям с использованием Grep

Вы можете использовать возможности регулярных выражений с помощью grep. Grep может искать шаблоны в файле или даже выполнять поиск в каталогах и подкаталогах.

Пользователи Windows могут установить grep с помощью winget. Просто введите эту команду в PowerShell:

winget install -e --id GnuWin32.Grep

Вы можете узнать больше о grep и его параметрах командной строки здесь

Использование замены с sed

Вы можете использовать sed для выполнения таких задач, как добавление, удаление или замена текста в текстовых файлах, и все это путем предоставления шаблона регулярного выражения. Если вы используете Windows, вы можете получить sed из определенного источника. Альтернативно, если вы используете WSL, такие инструменты, как grep и sed, уже доступны.

Ниже приведен общий способ использования sed:

sed 's/pattern/replacement/g' filename
echo "${text}" | sed 's/pattern/replacement/g'

В этом случае опция g используется для замены всех вхождений.

Есть еще пара полезных опций. Вы можете использовать параметр -n, чтобы запретить печать всех строк по умолчанию, и вы можете использовать p вместо +, чтобы печатать только те строки, на которые влияет регулярное выражение.

Давайте теперь рассмотрим текст, приведенный ниже 👇

Hello rand chars World 56 rand chars
Henlo 52 rand chars W0rld rand chars
GREP rand chars Henlo 62 rand chars
Henlo 10 rand chars Henlo rand chars
GREP rand chars Henlo 45 rand chars

Наша цель — изменить экземпляры Henlo, за которыми следует число, на Hello, за которым следует то же число, но только в строках, где появляется «GREP». Для этого мы ищем шаблон Henlo ([0-9]+), который соответствует «Henlo», за которым следует одна или несколько цифр. Все цифры зафиксированы. Заменой будет Hello \1 — где «\1» относится к захваченным цифрам.

Один из способов добиться этого — использовать комбинацию grep и sed. Сначала мы можем использовать grep для идентификации строк, содержащих «GREP», а затем использовать sed для соответствующих замен.

grep "GREP" texts.txt | sed -En 's/Henlo ([0-9]+)/Hello \1/p'

Опция «-E» включает расширенное регулярное выражение, без которого вам пришлось бы выходить из круглых скобок.

Или вы можете просто использовать sed. Используйте /pattern/, чтобы ограничить замену только теми строками, где присутствует шаблон.

sed -En '/GREP/ s/Henlo ([0-9]+)/Hello \1/p' texts.txt

Подробнее о sed можно прочитать, перейдя по ссылке.

Некоторые реальные примеры использования регулярных выражений

1) Определение критериев анализа журналов

Вот как мы можем изложить требования для анализа журналов с использованием регулярных выражений:

  • Записи журнала должны состоять минимум из 8 символов, но не должны превышать 16 символов.
  • Каждая запись журнала должна содержать хотя бы одну строчную букву.
  • При этом оно должно содержать хотя бы одну заглавную букву.
  • Кроме того, оно должно включать хотя бы одно число.

2) Массовое переименование файлов

Мы можем разработать набор критериев для массового переименования файлов, используя регулярное выражение:

  • Имена файлов должны иметь длину не менее 8 символов, но не превышать 16 символов.
  • Каждое имя файла должно содержать хотя бы одну строчную букву.
  • Кроме того, оно должно включать хотя бы одну заглавную букву.
  • Наконец, оно должно включать хотя бы одно число.

3) Установление критериев проверки электронной почты

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

  • Адрес электронной почты должен иметь длину не менее 8 символов, но не более 16 символов.
  • Он должен содержать хотя бы одну строчную букву.
  • Он также должен включать хотя бы одну заглавную букву.
  • Кроме того, он должен иметь хотя бы один номер.

4) Установка требований к паролю

мы можем сформулировать регулярное выражение, которое обеспечивает соблюдение этих условий:

  • Длина пароля должна быть не менее 8 символов, но не более 16 символов.
  • Он должен содержать хотя бы одну строчную букву.
  • Он также должен содержать хотя бы одну заглавную букву.
  • Кроме того, он должен иметь хотя бы один номер.

Еще несколько примеров вы можете прочитать здесь: Нажмите, чтобы посмотреть

Я надеюсь, что это руководство дало вам ценную практику. Не беспокойтесь о запоминании каждой детали; понимание основных концепций важнее всего. Если вы забудете выкройку, вы всегда можете поискать или воспользоваться шпаргалкой.

По мере практики вы станете более самостоятельными. В Интернете можно найти полезные шпаргалки, например, от QuickRef, по синтаксису и функциям, специфичным для языка.

Помните, что методы регулярных выражений одинаковы для всех языков, хотя инструменты могут предлагать дополнительные возможности. Изучите свой инструмент, чтобы сделать правильный выбор.

Не используйте регулярное выражение просто так; часто бывает достаточно более простых методов. Но в терминальной работе регулярное выражение является мощным инструментом.

Итак, давайте закончим этот блог сегодня. Я надеюсь, что эти инструменты обязательно помогут вам в вашей повседневной жизни. Если вы все еще здесь и читаете это. Подумайте о том, чтобы подписаться на меня и подписаться на уведомления по электронной почте, чтобы быть в курсе безумного контента, который я буду загружать.

К любому обсуждению вы можете добавить комментарий.

Чтобы получить больше контента, подписывайтесь на мой блог или Twitter.