Введение в регулярные выражения в Python

В этом руководстве мы узнаем об использовании регулярных выражений в Python, включая их синтаксис, и о том, как их создавать с помощью встроенных модулей Python. Для этого мы рассмотрим различные операции в модуле Python re [https://docs.python.org/2/library/re.html] и способы его использования в ваших приложениях Python. Что такое регулярные выражения? Регулярные выражения - это в основном просто последовательность символов, которая может использоваться для определения шаблона поиска для поиска текста. Эта "поисковая система"

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

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

Регулярные выражения - это в основном просто последовательность символов, которая может использоваться для определения шаблона поиска для поиска текста. Эта «поисковая машина» встроена в язык программирования Python (а также во многие другие языки) и доступна через модуль re

Чтобы использовать регулярные выражения (или для краткости «регулярное выражение»), вы обычно указываете правила для набора возможных строк, которые вы хотите сопоставить, а затем задаете себе такие вопросы, как «Соответствует ли эта строка шаблону?» Или «Есть ли совпадение с шаблоном в любом месте этой строки? ".

Вы также можете использовать регулярные выражения для изменения строки или разделения ее различными способами. Все эти операции «более высокого порядка» начинаются с первого сопоставления текста со строкой регулярного выражения, а затем строкой можно манипулировать (например, разделять) после того, как совпадение найдено. Все это стало возможным благодаря re , который мы рассмотрим далее в некоторых последующих разделах.

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

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

Соответствующие персонажи

Регулярные выражения могут содержать как специальные, так и обычные символы. Большинство обычных символов, таких как «A», «a» или «0», являются простейшими регулярными выражениями; они просто соответствуют себе. Существуют также другие специальные символы, которые не могут соответствовать друг другу, например ^ , $ , * , + ? , { , } , [ , ] , \ , | , ( , и ) . Это связано с тем, что они используются для функций сопоставления более высокого порядка, которые описаны далее в этой таблице:

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


* Соответствует предыдущему элементу ноль или более раз. Например, ab*c соответствует «ac», «abc», «abbbc» и т. Д. [xyz]* соответствует «», «x», «y», «z», «zx», «zyx», « xyzzy "и так далее. (ab)* соответствует "", "ab", "abab", "ababab" и так далее. + Один или несколько раз соответствует предыдущему элементу. Например, ab+c соответствует «abc», «abbc», «abbbc» и т. Д., Но не «ac». ? Соответствует предыдущему элементу ноль или один раз. Например, ab?c соответствует только «ac» или «abc». | Оператор выбора (также известный как чередование или объединение набора) соответствует либо выражению до, либо выражению после этого оператора. Например, abc|def может соответствовать как «abc», так и «def». . Соответствует любому одиночному символу (многие приложения исключают новые строки, и какие именно символы считаются новыми строками, зависит от вкуса, кодировки символов и платформы, но можно с уверенностью предположить, что символ перевода строки включен). В выражениях скобок POSIX символ точки соответствует буквальной точке. Например, ac соответствует «abc» и т. Д., Но [ac] соответствует только «a», «.» Или «c». ^ Соответствует начальной позиции в строке, как startsWith() . В линейных инструментах он соответствует начальной позиции любой строки. ? Соответствует конечной позиции строки или положению непосредственно перед новой строкой, заканчивающейся строкой, например, функции endsWith() . В линейных инструментах он соответствует конечной позиции любой строки.

[Кредит Википедии за некоторые описания регулярных выражений.]{.small}

Методы регулярных выражений в Python

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

  1. re.match ()
  2. исследовать()
  3. re.findall ()
  4. re.split ()
  5. re.sub ()
  6. re.compile ()

re.match (шаблон, строка, флаги = 0)

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

Выражение ниже вернет None потому что Python не появляется в начале строки.

 # match.py 
 
 import re 
 result = re.match(r'Python', 'It\'s easy to learn Python. Python also has elegant syntax') 
 
 print(result) 

 $ python match.py 
 None 

re.search (шаблон, строка)

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

В следующем коде мы просто пытаемся определить, появляется ли слово «щенок» в строке «Дейзи нашла щенка».

 # search.py 
 
 import re 
 
 if re.search("puppy", "Daisy found a puppy."): 
 print("Puppy found") 
 else: 
 print("No puppy") 

Здесь мы сначала импортируем re и используем его для поиска вхождения подстроки «щенок» в строке «Дейзи нашла щенка». Если он существует в строке, возвращается объект re.MatchObject, который считается «правдивым» при оценке в операторе if.

 $ python search.py 
 Puppy found 

re.compile (шаблон, флаги = 0)

Этот метод используется для компиляции шаблона регулярного выражения в объект регулярного выражения, который можно использовать для сопоставления с использованием его методов match() и search() , которые мы обсуждали выше. Это также может сэкономить время, поскольку выполнение синтаксического анализа / обработки строк регулярных выражений может быть дорогостоящим в вычислительном отношении.

 # compile.py 
 
 import re 
 
 pattern = re.compile('Python') 
 result = pattern.findall('Pythonistas are programmers that use Python, which is an easy-to-learn and powerful language.') 
 
 print(result) 
 
 find = pattern.findall('Python is easy to learn') 
 
 print(find) 

 $ python compile.py 
 ['Python', 'Python'] 
 ['Python'] 

Обратите внимание, что возвращается только соответствующая строка, в отличие от всего слова в случае «Pythonistas». Это более полезно при использовании строки регулярного выражения, в которой есть специальные символы соответствия.

re.sub (шаблон, repl, строка)

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

 # sub.py 
 
 import re 
 result = re.sub(r'python', 'ruby', 'python is a very easy language') 
 
 print(result) 

 $ python sub.py 
 ruby is a very easy language 

re.findall (шаблон, строка)

Как вы видели до этого раздела, этот метод находит и извлекает список всех вхождений в данной строке. Он сочетает в себе функции и свойства re.search() и re.match() . В следующем примере из строки будут извлечены все вхождения «Python».

 # findall.py 
 
 import re 
 
 result = re.findall(r'Python', 'Python is an easy to learn, powerful programming language. Python also has elegant syntax') 
 print(result) 

 $ python findall.py 
 ['Python', 'Python'] 

Опять же, использование такой строки точного соответствия («Python») действительно полезно только для определения того, встречается ли строка регулярного выражения в данной строке или сколько раз она встречается.

re.split (шаблон, строка, maxsplit = 0, flags = 0)

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

 # split.py 
 
 import re 
 
 result = re.split(r"y", "Daisy found a puppy") 
 
 if result: 
 print(result) 
 else: 
 print("No puppy") 

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

 $ python split.py 
 ['Dais', ' found a pupp', ''] 

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

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

Создание URL

У каждой веб-страницы есть URL-адрес. Теперь представьте, что у вас есть веб-сайт Django с адресом вроде « http://www.example.com/products/27/ », где 27 - это идентификатор продукта. Было бы очень обременительно писать отдельные представления для каждого отдельного продукта.

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

Выражение, которое будет соответствовать и извлекать любой числовой идентификатор, может быть ^products/(\d+)/$ .

  • ^products/ сообщает Django о том, что нужно сопоставить строку, в которой есть "products /" в начале URL-адреса (где "начало" строки указано знаком ^ )
  • (\d+) означает, что будет число (указанное \d+ ), и мы хотим, чтобы оно было захвачено и извлечено (указано круглыми скобками)
  • / сообщает Django, что за ним должен следовать другой символ "/"
  • $ указывает конец URL-адреса, что означает, что этому шаблону будут соответствовать только строки, заканчивающиеся на /.

Проверка адресов электронной почты

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

 # validate_email.py 
 
 import re 
 
 email = " [email protected] " 
 
 if not re.match(re.compile(r'^ [email protected] [^.].*\.[az]{2,10}$', flags=re.IGNORECASE), email): 
 print("Enter a valid email address") 
 else: 
 print("Email address is valid") 

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

Итак, как и следовало ожидать, код соответствует нашему примеру адреса:

 $ python validate_email.py 
 Email address is valid 

Проверка телефонных номеров

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

 # validate_numbers.py 
 
 import re 
 
 numbers = ["+18009592809", "=18009592809"] 
 
 for number in numbers: 
 if not re.match(re.compile(r"^(\+1?[-. ]?(\d+))$"), number): 
 print("Number is not valid") 
 else: 
 print("Number is valid") 

 $ python validate_numbers.py 
 Number is valid 
 Number is not valid 

Как видите, поскольку второе число использует символ «=» вместо «+», оно считается недействительным.

Фильтрация нежелательного контента

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

 # filter.py 
 
 import re 
 
 curse_words = ["foo", "bar", "baz"] 
 comment = "This string contains a foo word." 
 curse_count = 0 
 
 for word in curse_words: 
 if re.search(word, comment): 
 curse_count += 1 
 
 print("Comment has " + str(curse_count) + " curse word(s).") 

 $ python filter.py 
 Comment has 1 curse word(s). 

Заключение

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

comments powered by Disqus