Python Regex: введение в использование регулярных выражений

Python Regex Программирование и разработка

Python Regex

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

^ [ A-Za-z0-9._% + — ] + @ [ A-Za-z0-9.- ] + \. [ A-Za-z ] {2,} $

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

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

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

«Привет мир»

«555-555-5555»

«Джон Доу

123 Main St.

Где угодно, США 99999-9999»

«Email@email.io»

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

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

Для чего используются регулярные выражения?

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

Искать и заменить

Скажем, например, у нас есть номер телефона, представленный в следующем формате:

555 555 5555

Это допустимый формат номера телефона в США. Но что, если мы захотим заменить пробелы тире? Или добавить код города в круглые скобки и тире, чтобы сделать его более читабельным?

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

Результат, который мы увидим после поиска и замены номера телефона в Python для формата, который мы хотели бы использовать, будет следующим:

555-555-5555

или

(555)555-5555

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

Подтвердить

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

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

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

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

Типы сопоставителей шаблонов регулярных выражений

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

Буквальные символы

Самый простой пример сопоставления шаблонов в регулярном выражении — это буквальный символ. Он соответствует жёстко закодированному символу или строке.

Примеры:

hello ⇒ набор из пяти различных символов.

Когда здесь применяется шаблон регулярного выражения, он последовательно ищет каждый из этих символов. «Hello», «helloing» или «helloed» пройдут проверку по образцу, а «Hello», «helo» или «HeLlo» — нет.

A ⇒ набор одного отличного персонажа.

Поскольку регулярное выражение ищет отдельные символы, оно также чувствительно к регистру. Таким образом, «А» пройдёт, а «А» — нет. Мы поговорим об этом подробнее чуть позже.

A simple sentence\. ⇒ набор из нескольких различных символов.

Regex ищет каждый символ в выражении последовательно при просмотре строки. Если «Простое предложение» не находится в искомой строке точно так, как написано в регулярном выражении, оно не пройдёт.

Персонажи побега

Взгляните на последний пример. Обратите внимание, что перед точкой стоит \. Точка в синтаксисе регулярных выражений является синонимом ключевых слов в таких языках, как JavaScript или Python.

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

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

  • Звёздочка *
  • Обратная косая черта /
  • Плюс +
  • Карет ^
  • Знак доллара $
  • Точка / точка.
  • Труба |
  • Вопросительный знак?
  • Круглые скобки — оба типа ()
  • Фигурные скобки — оба типа {}

Буквальные символы в регулярном выражении точно соответствуют символу, который вы включаете как часть шаблона. Если вы хотите включить символ, который указан выше, обязательно избегайте его, чтобы он также мог быть частью вашего регулярного выражения.

Общие сопоставители

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

Матчер

Описание

Пример

. Соответствует любому персонажу nw будет соответствовать now, naw или new и т. д. Любой персонаж проходит тест
^ регулярное выражение Ищет узор в начале строки ^ hello соответствует приветствию в строке, начинающейся с этого шаблона
регулярное выражение $ Ищет узор в конце строки world $ будет соответствовать миру в строке, которая заканчивается этим шаблоном
[abc] Соответствует a, b или c [misp] считается набором и соответствует любой строке, содержащей любой из этих символов.
Например, он может соответствовать всем отдельным буквам в слове «миссисипи» и «пропустить», но только некоторым буквам в языке «marsh» и «миссисури»
[abc] [xyz] Соответствует a, b или c, за которым следует x, y или z / [Mm] [sip] / будет соответствовать любой строке, начинающейся с M или m, за которой следует набор, содержащий любой из символов в [sip]
[^ abc] Не a, b или c [^ rstlne] будет соответствовать любому символу, кроме r, s, t, l, n или e.
[a-zA-Z0-9] Соответствует любому символу в диапазоне [an] соответствует любому символу от a до n. и, конец, слепой, может, у всех есть символы, которые здесь полностью совпадают
А | Б А или В М | м. будет соответствовать любому слову или фразе длиной не менее двух символов, которые соответствуют букве M или m плюс ещё один или несколько других символов.
КОТ Соответствует C, затем A, затем T привет мир будет соответствовать привет мир точно

Метасимволы

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

Метасимвол Описание

Пример

\ d Соответствует любой цифре \ d соответствует 1, 2 или 3 и т. д. Сокращение для [0-9]
\ D Соответствует любому нецифровому символу \ D будет соответствовать A, B, g и т.д. Сокращение для [^ 0-9]
\ s Соответствует любому пробельному символу \ s будет соответствовать новым строкам, табуляциям, пробелам и т. д.
\ S Соответствует любому непробельному символу \ S будет соответствовать любому символу, кроме символа пробела.
\ w Соответствует любому символу слова Словесный символ, сокращение от [a-zA-Z_0-9]
\ W Соответствует любому символу, не являющемуся словом [\ W] соответствует любым специальным символам. Сокращение для [^ \ w]

Примечание. Метасимволы заглавных букв (\ W, \ D и т.д.) Обычно соответствуют противоположному тому, что делают метасимволы строчных букв (\ w, \ d и т.д.).

Квантификаторы

Квантификатор Описание

Пример

+ Один или несколько предыдущих персонажей \ d + соответствует двум или более цифрам
* Ноль или более предшествующих символов . * соответствует любому символу 0 или более раз.
Примечание: Технически пустая строка будет соответствовать этому регулярному выражению!
? Ноль или один из предшествующих символов a?. * соответствует a, any, hello, world 
{количество} Соответствует предыдущему символу ровно количество раз \ d {3} соответствует ровно трём цифрам [0-9]
{число1, число2} Соответствует предыдущему символу в диапазоне чисел \ d {3,5} соответствует 3-5 цифрам, которые являются [0-9]

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

Однако есть некоторые вещи, которые используются, например, в Ruby или JavaScript, которые нельзя перенести на Python.

Давайте узнаём немного больше о том, как регулярные выражения работают в Python, в следующем разделе.

Как регулярные выражения работают в Python?

Чтобы использовать регулярные выражения в Python, импортируйте reмодуль в начало файла.

import re
string = «The quick brown fox jumped over the lazy dog»

result = re.search(«q.+k\s», string) # this is the match object if it returns a positive result. It will return a NoneType object otherwise
print(result.span(), «<== This is the tuple containing the span of indexes the result is in»)
print(result.string, «<== This is the original string «)
print(result.group(), «<== This is the group of characters that match our regex pattern»)

===================================================================

import re
string = «»»The
quick brown
fox jumped over the lazy dog
«»»

result = re.search(«»»
^ # beginning of line
Q # literal character ‘Q’
. # dot ==> any character
+ # quantifier == more than 1
k # literal character ‘k’
\s # special character ‘\s’
«»», string, flags=re.IGNORECASE | re.M | re.VERBOSE)

if result:
print(result.span(), «<== This is the tuple containing the span of indexes the result is in»)
print(result.string, «<== This is the original string «)
print(result.group(), «<== This is the group of characters that match our regex pattern»)
else:
print(result)

===================================================================

import re
print(re.match(«quick», str, flags=re.IGNORECASE))
print(re.search(«quick», str, flags=re.IGNORECASE | re.MULTILINE))

===================================================================

import re
phone = «555 555 5555»
correctFormat = re.sub(«\s», «-«, phone)
print(correctFormat)

===================================================================

import re

left_parens = re.sub(«^», «(«, phone)
right_parens = re.sub(«\s», «)», left_parens, 1)
secondCorrectFormat = re.sub(«\s», «-«, right_parens)
print(secondCorrectFormat)

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

Самое интересное в том, как использовать различные методы, доступные нам в модуле re.

re.search (регулярное выражение, str, flags = 0)

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

Если шаблон регулярного выражения НЕ содержится в строке, интерпретатор вернётся None. Если есть совпадение, Match будет возвращён объект, который будет содержать некоторую информацию о нём.

У Matchобъекта есть свойство и два метода, которые можно использовать для получения информации о совпадении:

  • match_obj.span() метод, который возвращает кортеж, содержащий начальную и конечную позиции совпадения (конечная позиция включена).
  • match_obj.string свойство, которое возвращает строку, переданную в функцию.
  • match_obj.group() метод, который возвращает часть строки, в которой было совпадение.
  • match_objздесь будет заменено переменной, которую вы назначаете результату вашего re.search()метода.

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

import re

string = «The quick brown fox jumped over the lazy dog»

result = re.search(«q.+k\s», string) # this is the match object if it returns a positive result. It will return a NoneType object otherwise
print(result.span(), «<== This is the tuple containing the span of indexes the result is in»)
print(result.string, «<== This is the original string «)
print(result.group(), «<== This is the group of characters that match our regex pattern»)

Здесь главное помнить, что у Matchобъекта в Python есть методы и свойства.

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

Есть и другие методы, и свойства, на которые можно ссылаться в документации Python, но они хороши для начала.

Необязательные аргументы

Существует необязательный аргумент, который вы также можете использовать с reметодом поиска модуля. Чтобы использовать его, назначьте flagsпараметр списку флагов, которые вы хотели бы использовать. По умолчанию установлено значение 0. Некоторые из наиболее популярных вариантов:

re.DEBUG
Этот флаг при необходимости отображает отладочную информацию о скомпилированном регулярном выражении.

  • re.I
    re.IGNORECASE
    Сопоставление без учёта регистра. Это будет игнорировать регистр символов, переданных в наборы или буквальные символы, так что буквы в верхнем и нижнем регистре будут совпадать.
  • re.M
    re.MULTILINE
    Многострочный режим. Позволяет использовать метасимволы регулярного выражения начала и конца строки в многострочных строках. В противном случае он просто смотрел бы на начало и конец строки. Без флага multiline механизм регулярных выражений считает строку одной строкой.
  • re.S
    re.DOTALL
    Этот флаг сообщает механизму регулярных выражений, что символ точки будет соответствовать любому символу. По умолчанию точка соответствует каждому символу, кроме символа новой строки.
  • re.X
    re.VERBOSE
    Флаг подробности позволяет добавлять комментарии к регулярному выражению, чтобы разбить его на части и прокомментировать его назначение. Это может очень помочь, когда вы изучаете регулярное выражение на Python.

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

import re

string = «»»The
quick brown
fox jumped over the lazy dog
«»»

result = re.search(«»»
^ # beginning of line
Q # literal character ‘Q’
. # dot ==> any character
+ # quantifier == more than 1
k # literal character ‘k’
\s # special character ‘\s’
«»», string, flags=re.IGNORECASE | re.M | re.VERBOSE)

if result:
print(result.span(), «<== This is the tuple containing the span of indexes the result is in»)
print(result.string, «<== This is the original string «)
print(result.group(), «<== This is the group of characters that match our regex pattern»)
else:
print(result)

Обратите внимание на то, как флаги помогают нам в тестировании нашей строки. Попробуйте убрать параметр flags. Возвращает ли строка результат? Если нет, то что он в результате вернёт?

Помните, что метод поиска в модуле re принимает регулярное выражение, строку для поиска и необязательный параметр flags. Истинное значение вернёт объект Match, с которым связаны свойства и методы. Ложное значение возвращает объект NoneType.

re.match (regex, str, flags = 0)

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

import re

string = «»»The
quick brown
fox jumped over the lazy dog
«»»

print(re.match(«quick», string, flags=re.IGNORECASE | re.MULTILINE))
print(re.search(«quick», string, flags=re.IGNORECASE | re.MULTILINE))

Посмотрев на этот код в интерпретаторе Python, вы увидите, что первый метод match()не возвращает Matchобъект, а вместо этого None. Второй позволяет заглянуть внутрь строки и вернёт Matchобъект. Это потому, что match()метод просматривает только начало строки, даже если re.MULTILINEфлаг поднят.

re.sub (findRegex, replaceWith, str, count = 0, flags = 0)

sub()Метод в модуле повторно принимает регулярное выражение, находит самый левый матч в строке, и заменяет его с чем — то другим. Он повторяет ту же операцию столько раз, сколько указано в параметре count. Если параметр счётчика отсутствует или он установлен на ноль, все вхождения будут заменены.

В начале статьи мы говорили о переформатировании номера телефона. Давайте посмотрим, как это сделать здесь:

import re

phone = «555 555 5555»
correctFormat = re.sub(«\s», «-«, phone)
print(correctFormat) # 555-555-5555

Это берёт нашу телефонную строку, находит все вхождения пробелов и заменяет их тире. В этом случае мы получаем 555-555-5555.

Попробуем переформатировать посложнее:

import re

phone = «555 555 5555»

left_parens = re.sub(«^», «(«, phone)
right_parens = re.sub(«\s», «)», left_parens, 1)
secondCorrectFormat = re.sub(«\s», «-«, right_parens)
print(secondCorrectFormat) # (555)555-5555

В этом примере мы переходим к началу строки, чтобы добавить открытые скобки и присвоить эту новую строку переменной.

Затем мы берём эту вновь назначенную переменную ( left_parens) и используем её для выполнения той же операции по поиску следующего доступного символа пробела, чтобы заменить его закрывающими круглыми скобками. Это присвоено right_parens.

Наконец, мы берём right_parensпеременную и используем её для выполнения той же операции с последним пробельным символом, заменяя его тире.

Это даст нам (555)555-5555.

Напомним, sub()метод принимает шаблон регулярного выражения, заменяющую строку или функцию, фактическую строку, которую мы хотим выполнить sub(), и счётчик. Если мы не предоставим счёт, он выполнит замену во всех случаях. Он возвращает новую строку с выполненными заменами.

Заключение

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

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

Читайте также:  Хэш-таблица в Java
Оцените статью
bestprogrammer.ru
Добавить комментарий