RegEx в серии Python

Регулярные выражения (RegEx) в Python: дополнительные понятия

Добавьте продвинутые навыки в свой набор навыков RegEx

Мотивация

Многие веб-сайты требуют пароль не менее восьми символов и особые требования. Но задумывались ли вы когда-нибудь, как веб-сайты проверяют ваши пароли на соответствие этим требованиям? Ответ: Регулярное выражение или RegEx. Регулярное выражение является важным навыком для любого программиста и специалиста по данным для работы с текстом (строками). Вы также можете использовать его для очистки текстовых данных при обработке естественного языка!

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



Сводка метасимволов регулярных выражений

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

1. Сопоставьте любой символ с. (период)

Точка . в шаблоне регулярного выражения может использоваться для соответствия любому символу, кроме символа новой строки \n . Как показано на следующем рисунке, . используется вместе с квантификатором + для соответствия чему-либо после https:// .

2. Укажите место поиска с помощью ^ (каретка) и $ (доллар)

На следующем изображении мы извлекаем сиквелы фильмов о Человеке-пауке. Однако он дает результаты из всего текста. Что, если мы хотим, чтобы шаблон совпадал только в начале или в конце текста?

Указание ^ перед шаблоном будет искать потенциальное совпадение в начале текста, как показано на рисунке ниже.

Точно так же указание $ в конце шаблона приведет к поиску потенциального совпадения в конце текста, как показано ниже.

3. Оператор ИЛИ | (трубка)

Предположим, у нас есть два паттерна — A и B; мы хотим соответствовать любому из шаблонов. Это можно сделать с помощью A|B. Другими словами, A|B означает соответствие чему-либо из A или B. Это также может быть расширено до более чем двух шаблонов, например. A|B|C|D|E

4. Укажите диапазон символов, используя [ ] (прямоугольные скобки)

Чтобы извлечь символ слова, мы можем использовать \w. Но что, если мы хотим сопоставить только буквы верхнего регистра? Мы можем указать такой диапазон символов внутри [] . например, [A-Z] означает соответствие любой одной заглавной букве. Путем количественной оценки с использованием знака плюс, такого как [A-Z]+ , можно сопоставить более одной буквы в верхнем регистре.

Несколько примеров диапазонов символов
1. [A-Z]:
соответствует любой одной заглавной букве
2. [A-Za-z ]: соответствует любой отдельной прописной или строчной букве
3. [0–9]:соответствует любой отдельной цифре от 0 до 9
4. [!@#]:соответствует любому отдельному символу из !, @ или #

Подробнее о диапазоне символов здесь.

Примечание. Внутри [] метасимволы, такие как .*+? и т. д., не имеют специального значения. К ним будут относиться буквально. Хотя специальный символ ^ внутри [] имеет другое значение.

5. Используйте ^ (вставка) внутри [ ], чтобы указать противоположный диапазон символов

Мы видели, что с помощью [A-Z] можно сопоставить любой символ верхнего регистра. Но что, если мы хотим сопоставить что угодно, кроме прописной буквы? Здесь мы можем использовать ^ внутри символа, диапазон, чтобы указать противоположный диапазон, например. [^A-Z] будет соответствовать чему угодно, кроме заглавной буквы.

Мотивация для группировки

Давайте извлечем веб-сайт из данного текста, используя шаблон регулярного выражения. Это просто, как показано ниже.

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

1. Группировка с помощью ( ) (круглые скобки)

Группы можно указать с помощью () . В следующем примере мы извлекаем фрагменты веб-сайта с помощью группировки. Звучит очень полезно, не так ли?

2. Укажите группы без захвата с помощью (?:)

Однако иногда мы хотим сопоставить определенные группы, но не хотим включать их в результаты. В приведенном ниже примере мы хотим сопоставить группу (www), но не хотим, чтобы она отображалась на выходе. Добавляя ?: перед сгруппированным шаблоном, например. (?:www) , мы можем сделать его группой без захвата.

3. Обратные ссылки на группы

Вы сопоставили группу с помощью регулярного выражения. Теперь вы хотите снова использовать совпадающую часть в том же шаблоне. Как мы можем это сделать? Обратные ссылки позволяют повторно использовать совпадающие части из групп захвата. Как показано на рисунке ниже, \1 может относиться к совпадению группы 1, а \2 — совпадению группы 2.

Давайте посмотрим на обратные ссылки в действии. В следующем примере мы повторно используем результат из второй группы, используя \2.

4. Утверждения LookArounds

Захватывающая часть регулярного выражения начинается! Предположим, вы хотите сопоставить шаблон только в том случае, если он предшествует определенному шаблону или предшествует ему. Другими словами, мы хотим сопоставить шаблон, только если его левая или правая часть соответствует определенному подшаблону. Слишком много теории! Время для примеров.

4.1 Положительный просмотр с использованием (?=)

Представьте, что у вас есть пять тестов с результатами, как показано на рисунке. Вы хотите получить только те тесты, которые прошли. Другими словами, нам нужно заглянуть перед Test\d, чтобы проверить, следует ли за ним текст Passed, а затем сопоставить только текст Test\d.

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

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

4.2 Отрицательный прогноз с использованием (?!)

Теперь мы хотим получить те тесты, за которыми не следует текст Passed. Это пример отрицательного просмотра вперед, поскольку мы не хотим, чтобы за определенным подшаблоном (здесь Passed) следовало что-то (здесь Test\d).

Конструкция для отрицательного просмотра вперед включает ?! перед подшаблоном.

4.3 Положительный просмотр назад с использованием (?‹=)

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

Конструкция положительного просмотра вперед включает ?<= перед подшаблоном.

4.4 Отрицательный просмотр назад с использованием (?‹!)

Это полная противоположность отрицательному взгляду вперед. Здесь мы хотим сопоставить что-то, только если этому НЕ предшествует определенный подшаблон. В следующем примере мы хотим получить число, только если оно НЕ НАЧИНАЕТСЯ с фунта стерлингов (£).

Конструкция отрицательного просмотра вперед включает ?<! перед подшаблоном.

Заключительные замечания

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

Вопрос.Как вы проверяете пароль со следующими условиями, используя регулярное выражение?
Условие1 —
Он должен содержать не менее 8 символов
Условие2 —
Он должен содержать хотя бы одну прописную и одну строчную букву
Условие3—
Он должен содержать хотя бы одну цифру
Примером пароля, соответствующего вышеуказанным условиям, является q1w2eR3T.

Не стесняйтесь делиться своими ответами в комментариях. Подписывайтесь на меня на Medium, если хотите больше таких историй.