Что найти?

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

/
/

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

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

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

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

Вы также можете использовать регулярные выражения для изменения строки или разделения ее различными способами. Все эти операции «более высокого порядка» начинаются с первого сопоставления текста со строкой регулярного выражения, а затем строкой можно манипулировать (например, разделять) после того, как совпадение найдено. Все это стало возможным благодаря доступному в Python модулю 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».
^ Соответствует начальной позиции в строке, как функция startWith(). В линейных инструментах он соответствует начальной позиции любой строки.
? Соответствует конечной позиции строки или положению непосредственно перед новой строкой, заканчивающейся строкой, например, функции endWith(). В линейных инструментах он соответствует конечной позиции любой строки.

Методы

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

  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']

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

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][^.].*\.[a-z]{2,10}$', flags=re.IGNORECASE), email):
    print("Enter a valid email address")
else:
    print("Email address is valid")

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

  • ^ [электронная почта защищена]: соответствует каждому символу от начала строки до символа ‘@’.
    • Соответствует «[электронная почта защищена]» от «[электронная почта защищена]».
  • [^.]. *: Соответствует всем символам, кроме «.».
    • Соответствует «gmail» из «[электронная почта защищена]».
  • \. [az] {2,10} $: соответствие символов TLD домена (максимальной длины 10 символов) до конца строки.
    • Соответствует «.com» из «[адрес электронной почты защищен]».

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

$ 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).

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

This div height required for enabling the sticky sidebar