В этом руководстве мы узнаем об использовании регулярных выражений в 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
Есть несколько доступных методов использования регулярных выражений. Здесь мы собираемся обсудить некоторые из наиболее часто используемых методов, а также привести несколько примеров их использования. Эти методы включают:
- re.match ()
- исследовать()
- re.findall ()
- re.split ()
- re.sub ()
- 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")
Как видите, это довольно сложная строка регулярного выражения. Давайте немного разберемся, используя пример адреса электронной почты в приведенном выше коде. В основном это означает следующее:
^ [email protected]
: соответствует каждому символу от начала строки до символа '@'- Соответствует " [электронная почта защищена]{.cf_email} " от " [[электронная почта защищена]]{.cf_email cfemail=“dabfa2bbb7aab6bf9abdb7bbb3b6f4b9b5b7”} "
[^.].*
: Соответствует всем символам, кроме "."- Соответствует "gmail" из " [[электронная почта защищена]]{.cf_email cfemail=“63061b020e130f0623040e020a0f4d000c0e”} "
\.[az]{2,10}$
: соответствие символов TLD домена (с максимальной длиной 10 символов) до конца строки- Соответствует ".com" из " [[защищенный адрес электронной почты]]{.cf_email cfemail=“5e3b263f332e323b1e39333f3732703d3133”} "
Итак, как и следовало ожидать, код соответствует нашему примеру адреса:
$ 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 , у которого есть масса ресурсов, которые помогут вам достичь целей вашего приложения.