Автор оригинала: Esther Vaati.
Введение в Регулярные выражения в Python
В этом уроке мы узнаем об использовании регулярных выражений в Python, включая их синтаксис, и о том, как их построить с помощью встроенных модулей Python. Для этого мы рассмотрим различные операции в модуле Python re и то , как использовать его в ваших приложениях Python.
Что такое регулярные выражения?
Регулярные выражения-это в основном просто последовательность символов, которая может быть использована для определения шаблона поиска текста. Эта “поисковая система” встроена в язык программирования Python (а также во многие другие языки) и доступна через модуль re
.
Чтобы использовать регулярные выражения (или сокращенно “регулярное выражение”), вы обычно указываете правила для набора возможных строк, которые вы хотите сопоставить, а затем задаете себе такие вопросы, как “Соответствует ли эта строка шаблону?” или “Есть ли совпадение для шаблона где-нибудь в этой строке?”.
Вы также можете использовать регулярные выражения для изменения строки или разбиения ее на части различными способами. Все эти операции “высшего порядка” начинаются с первого сопоставления текста со строкой регулярного выражения, а затем строкой можно манипулировать (например, разбивать), как только совпадение найдено. Все это стало возможным благодаря модулю re
, доступному в Python, который мы рассмотрим далее в некоторых последующих разделах.
Синтаксис регулярных выражений
Регулярное выражение задает шаблон, который стремится соответствовать входной строке. В этом разделе мы покажем некоторые специальные символы и шаблоны, которые вы можете использовать для сопоставления строк.
Совпадающие Символы
Регулярные выражения могут содержать как специальные, так и обычные символы. Самые обычные символы, такие как “А”, ” а ” или “0”, являются простейшими регулярными выражениями; они просто совпадают сами с собой. Есть и другие специальные символы, которые не могут соответствовать сами себе, т. е. ^
, $
, *
, +
, ?
, {
, }
, [
, ]
, \
, |
, (
, и )
. Это связано с тем, что они используются для функций сопоставления более высокого порядка, которые описаны далее в этой таблице:
Соответствует предыдущему элементу ноль или более раз. Например, ab*c соответствует “ac”, “abc”, “abbc” и т. Д. [xyz]* соответствует “”, “x”, “y”, “z”, “zx”, “zyx”, “xyzzy” и т. Д. (ab)* соответствует “”, “ab”, “abab”, “ababab” и т. Д. | * |
Соответствует предыдущему элементу один или несколько раз. Например, ab+c соответствует “abc”, “abbc”, “abbbc” и так далее, но не “ac”. | + |
Соответствует предыдущему элементу ноль или один раз. Например, ab?c соответствует только “ac” или “abc”. | ? |
Оператор выбора (также известный как alternation или set union) совпадает либо с выражением до, либо с выражением после этого оператора. Например, abc|def может соответствовать либо “abc”, либо “def”. | | |
Соответствует любому отдельному символу (многие приложения исключают новые строки, и именно то, какие символы считаются новыми строками, зависит от вкуса, кодировки символов и платформы, но можно с уверенностью предположить, что символ перевода строки включен). В выражениях скобок POSIX символ точки соответствует буквальной точке. Например, a.c соответствует “abc” и т. Д., Но [a. c] соответствует только “a”, “. ” или “c”. | . |
Соответствует начальной позиции в строке, как и функция StartsWith (). В линейных инструментах он соответствует начальной позиции любой линии. | ^ |
Соответствует конечной позиции строки или позиции непосредственно перед новой строкой, заканчивающейся строкой, как функция EndsWith (). В линейных инструментах он соответствует конечному положению любой линии. | ? |
Методы регулярных выражений в Python
Существует несколько методов использования регулярных выражений. Здесь мы обсудим некоторые из наиболее часто используемых методов, а также приведем несколько примеров того, как они используются. Эти методы включают в себя:
- ре.матч()
- re.поиск()
- re.поиск()
- ре.раскол()
- re.sub()
- re.compile()
re.match(pattern, string,)
Это выражение используется для сопоставления символа или набора символов в начале строки. Также важно отметить, что это выражение будет совпадать только в начале строки, а не в начале каждой строки, если данная строка имеет несколько строк.
Приведенное ниже выражение вернет 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.поиск(шаблон, строка)
Этот модуль проверяет совпадение anywhere в данной строке и возвращает результаты, если они найдены, и None
если они не найдены.
В следующем коде мы просто пытаемся найти, появляется ли слово “щенок” в строке “Дейзи нашла щенка”.
# search.py import re if re.search("puppy", "Daisy found a puppy."): print("Puppy found") else: print("No puppy")
Здесь мы сначала импортируем модуль re
и используем его для поиска вхождения подстроки “puppy” в строку “Daisy found a puppy”. Если он существует в строке, возвращается объект re.Match , который считается “истинным” при вычислении в операторе if.
$ python search.py Puppy found
re.compile(шаблон,)
Этот метод используется для компиляции шаблона регулярного выражения в объект регулярного выражения, который может быть использован для сопоставления с помощью его методов 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(pattern, repl, string)
Как следует из названия, это выражение используется для поиска и замены новой строки, если возникает шаблон.
# 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(шаблон, строка,,)
Это выражение будет разбивать строку в том месте, в котором указанный шаблон встречается в строке. Он также вернет текст всех групп в шаблоне, если в шаблоне используется расширенная функция, такая как захват скобок .
# 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+
), и мы хотим, чтобы оно было захвачено и извлечено (задано скобками)(\(\d+)
означает, что будет число (заданное\d+
), и мы хотим, чтобы оно было захвачено и извлечено (задано скобками)
Проверка Адресов Электронной Почты
Каждая система аутентификации требует, чтобы пользователи зарегистрировались и вошли в систему, прежде чем им будет разрешен доступ к системе. Мы можем использовать регулярное выражение, чтобы проверить, является ли указанный адрес электронной почты допустимым форматом.
# 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")
Как видите, это довольно сложная строка регулярных выражений. Давайте немного разберем его, используя пример адреса электронной почты в приведенном выше коде. В основном это означает следующее:
^
[email protected]
: Сопоставьте каждый символ от начала строки до символа’@’.- Совпадения ” [email protected] ” от “[email protected] “
[^.].*
: Соответствует каждому символу кроме “.”- Соответствует “gmail” из “[email protected] “
\.[a-z]{2,10}$
: Сопоставьте символы домена TLD (с максимальной длиной 10 символов) до конца строки- Матчи “.com” от “[email protected] “
Итак, как и следовало ожидать, код совпадает с нашим примером адреса:
$ 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 , который имеет массу ресурсов, чтобы помочь вам достичь целей вашего приложения.