Статьи

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

Задумывались ли вы, что является ключом к нахождению некоторого текста в документе или к тому, чтобы убедиться, что текст соответствует какому-либо формату, например, адресу электронной почты, и другим подобным операциям?

Ключ к таким операциям — регулярные выражения (регулярные выражения) . Давайте посмотрим некоторые определения для регулярных выражений. В Википедии регулярное выражение определяется следующим образом:

Последовательность символов, определяющих шаблон поиска, в основном для использования при сопоставлении с шаблоном или при сопоставлении строк, т. Е. Операции типа «найти и заменить». Эта концепция возникла в 1950-х годах, когда американский математик Стивен Клин формализовал описание обычного языка и стал широко использоваться в утилитах обработки текста Unix ed, редакторе и grep, фильтре.

Еще одно хорошее определение из регулярных выражений :

Регулярное выражение (для краткости регулярное выражение или регулярное выражение) — это специальная текстовая строка для описания шаблона поиска. Вы можете думать о регулярных выражениях как о подстановочных знаках на стероидах. Вы, вероятно, знакомы с символами подстановки, такими как * .txt, чтобы найти все текстовые файлы в файловом менеджере. Эквивалент регулярного выражения:. * \. Txt $

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

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

Скажи, что у тебя было это регулярное выражение:

1
/abder/

Это просто говорит нам, чтобы соответствовать только слово abder .

Как насчет этого регулярного выражения?

1
/a[nr]t/

Вы можете прочитать это регулярное выражение следующим образом: найдите текстовый шаблон, в котором первая буква является a а последняя — t , и между этими буквами идет либо n либо r . Таким образом, соответствующие слова — ant и art .

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

1
/ca[tbr]/

Если вы видите регулярное выражение, начинающееся с округлого акцента ^ , это означает совпадение строки, начинающейся со строки, упомянутой после ^ . Итак, если у вас есть регулярное выражение ниже, оно соответствует строке, которая начинается с This .

1
/^This/

Таким образом, в следующей строке:

1
2
3
My name is Abder
This is Abder
This is Tom

Основываясь на регулярном выражении /^This/ , будут сопоставлены следующие строки:

1
2
This is Abder
This is Tom

Что если мы хотим сопоставить строку, которая заканчивается какой-то строкой? В этом случае мы используем знак доллара $ . Вот пример:

1
Abder$

Таким образом, в приведенной выше строке (три строки) следующие шаблоны будут сопоставлены с использованием этого регулярного выражения:

1
2
My name is Abder
This is Abder

Что вы думаете об этом регулярном выражении?

1
^[AZ][az]

Я знаю, что это может показаться сложным на первый взгляд, но давайте рассмотрим это по частям.

Мы уже видели, что такое акцент при обтекании. Это означает совпадение строки, которая начинается с некоторой строки. [AZ] относится к заглавным буквам. Итак, если мы прочитаем эту часть регулярного выражения: ^[AZ] , это говорит нам о соответствии строки, которая начинается с заглавной буквы. Последняя часть, [az] , означает, что после нахождения строки, которая начинается с заглавной буквы, за ней следуют строчные буквы из алфавита.

Итак, какая из следующих строк будет сопоставлена ​​с помощью этого регулярного выражения? Если вы не уверены, вы можете использовать Python, как мы увидим в следующем разделе, чтобы проверить ваш ответ.

1
2
3
4
abder
Abder
ABDER
ABder

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

Хорошая ссылка, чтобы узнать больше о регулярных выражениях и увидеть больше примеров — RexEgg .

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

Первый пример был о поиске слова abder . В Python мы бы сделали это следующим образом:

1
2
3
4
import re
text = ‘My name is Abder’
match_pattern = re.match(r’Abder’, text)
print match_pattern

Если вы запустите приведенный выше скрипт Python, вы получите вывод: None !

Скрипт работает просто отлично, но проблема в том, как работает функция match() . Если мы вернемся к документации по re модулю, это то, что делает функция match() :

Если ноль или более символов в начале строки соответствуют шаблону регулярного выражения, вернуть соответствующий объект соответствия. Вернуть None, если строка не соответствует шаблону; обратите внимание, что это отличается от совпадения нулевой длины.

Ага, из этого мы можем видеть, что match() вернет результат, только если найдет совпадение в начале строки.

Вместо этого мы можем использовать функцию search() , которая основана на документации:

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

Итак, если мы напишем приведенный выше скрипт, но с search() вместо match() , мы получим следующий вывод:

<_sre.SRE_Match object at 0x101cfc988>

То есть match object соответствия был возвращен.

Если мы хотим вернуть результат (соответствие строки), мы используем функцию group() . Если мы хотим увидеть все совпадения, мы используем group(0) . Таким образом:

print match_pattern.group(0)

вернет вывод: Abder .

Если мы возьмем второе регулярное выражение в предыдущем разделе, то есть /a[nr]t/ , оно может быть написано на Python следующим образом:

1
2
3
4
import re
text = ‘This is a black ant’
match_pattern = re.search(r’a[nr]t’, text)
print match_pattern.group(0)

Выходные данные для этого скрипта: ant .

Статья становится длиннее, и тема регулярных выражений в Python, безусловно, занимает более одной статьи, если не отдельную книгу.

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