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

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

Примером регулярного выражения является r"^(From|To|Cc).*?python-list@python.org" Проясним: символ вставки ^ соответствует тексту в начале строки. Следующая группа, часть с (From|To|Cc) означает, что строка должна начинаться с одного из слов, разделенных чертой |. Это называется оператором ИЛИ, и регулярное выражение будет совпадать, если строка начинается с любого из слов в группе. .*? означает нежадное сопоставление любого количества символов, не считая символа новой строки \n. Нежадная часть означает совпадение как можно меньшего числа повторений. Символ . означает любой символ с не новой строки, символe * означает повторение 0 или более раз, а символ ? делает его нежадным.

Таким образом, этому регулярному выражению будут соответствовать следующие строки: From: python-list@python.org To: !asp]<,. python-list@python.org

Полная ссылка на синтаксис re доступна в python docs.

В качестве примера "правильного" регулярного выражения соответствия электронной почты (как в упражнении), смотрите это

# Example: import re pattern = re.compile(r"\[(on|off)\]") # Slight optimization print(re.search(pattern, "Mono: Playback 65 [75%] [-16.50dB] [on]")) # Returns a Match object! print(re.search(pattern, "Nada...:-(")) # Doesn't return anything. # End Example # Упражнение: make a regular expression that will match an email def test_email(your_pattern): pattern = re.compile(your_pattern) emails = ["john@example.com", "python-list@python.org", "wha.t.`1an?ug{}ly@email.com"] for email in emails: if not re.match(pattern, email): print("You failed to match %s" % (email)) elif not your_pattern: print("Forgot to enter a pattern!") else: print("Pass") pattern = r"" # Your pattern here! test_email(pattern) # Упражнение: make a regular expression that will match an email import re def test_email(your_pattern): pattern = re.compile(your_pattern) emails = ["john@example.com", "python-list@python.org", "wha.t.`1an?ug{}ly@email.com"] for email in emails: if not re.match(pattern, email): print("You failed to match %s" % (email)) elif not your_pattern: print("Forgot to enter a pattern!") else: print("Pass") # Your pattern here! pattern = r"\"?([-a-zA-Z0-9.`?{}]+@\w+\.\w+)\"?" test_email(pattern) test_output_contains("Pass") success_msg("Great work!")