Синтаксис регулярных выражений

В Python для работы с регулярными выражениями используется модуль re. Соответственно, для начала работы с регулярными выражениями надо его импортировать.

В Python некоторые символы строки надо экранировать, чтобы они воспринимались правильно. К таким символам относится, например, \. Чтобы написать правильно строку, в которой находятся два символа \\, оба символа надо экранировать и в итоге получится строка вида: \\\\data. Вместо этого, можно использовать raw-строку и тогда каждый символ будет восприниматься как написано. Raw-строки отличаются от обычных тем, что при создании строки, в начале пишется буква r:

In [3]: r"\\data"
Out[3]: '\\\\data'

Так как в регулярных выражениях постоянно используется \, всегда используйте raw-строки для описания регулярных выражений. Некоторые выражения правильно отработают и без raw-строк, но, использование raw-строк для регулярных выражений это хороший тон.

В этом разделе для всех примеров будет использоваться функция search. А в следующем подразделе будут рассматриваться остальные функции модуля re.

Синтаксис функции search такой:

match = re.search(regex, string)

У функции search два обязательных параметра:

  • regex - регулярное выражение
  • string - строка, в которой ищется совпадение

Если совпадение было найдено, функция вернет специальный объект Match. Если же совпадения не было, функция вернет None.

При этом особенность функции search в том, что она ищет только первое совпадение. То есть, если в строке есть несколько подстрок, которые соответствуют регулярному выражению, search вернет только первое найденное совпадение.

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

Самый простой пример регулярного выражения - подстрока:

In [1]: import re

In [2]: int_line = '  MTU 1500 bytes, BW 10000 Kbit, DLY 1000 usec,'

In [3]: match = re.search(r'MTU', int_line)

Примечание

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

В этом примере:

  • сначала импортируется модуль re
  • затем идет пример строки int_line
  • и в 3 строке функции search передается выражение, которое надо искать, и строка int_line, в которой ищется совпадение

В данном случае мы ищем, есть ли подстрока „MTU“ в строке int_line. Если она есть, в переменной match будет находиться специальный объект Match:

In [4]: print(match)
<_sre.SRE_Match object; span=(2, 5), match='MTU'>

У объекта Match есть несколько методов, которые позволяют получать разную информацию о полученном совпадении. Например, метод group показывает, что в строке совпало с описанным выражением.

В данном случае это подстрока „MTU“:

In [5]: match.group()
Out[5]: 'MTU'

Если совпадения не было, в переменной match будет значение None:

In [6]: int_line = '  MTU 1500 bytes, BW 10000 Kbit, DLY 1000 usec,'

In [7]: match = re.search(r'MU', int_line)

In [8]: print(match)
None

Полностью возможности регулярных выражений проявляются при использовании специальных символов. Например, символ \d означает цифру, а + означает повторение предыдущего символа один или более раз. Если их совместить \d+, получится выражение, которое означает одну или более цифр.

Используя это выражение, можно получить часть строки, в которой описана пропускная способность:

In [9]: int_line = '  MTU 1500 bytes, BW 10000 Kbit, DLY 1000 usec,'

In [10]: match = re.search(r'BW \d+', int_line)

In [11]: match.group()
Out[11]: 'BW 10000'

Особенно полезны регулярные выражения в получении определенных подстрок из строки. Например, необходимо получить VLAN, MAC и порты из вывода такого лог-сообщения:

In [12]: log2 = 'Oct  3 12:49:15.941: %SW_MATM-4-MACFLAP_NOTIF: Host f04d.a206.7fd6 in vlan 1 is flapping between port Gi0/5 and port Gi0/16'

Это можно сделать с помощью такого регулярного выражения:

In [13]: re.search(r'Host (\S+) in vlan (\d+) is flapping between port (\S+) and port (\S+)', log2).groups()
Out[13]: ('f04d.a206.7fd6', '1', 'Gi0/5', 'Gi0/16')

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

Выражение \d+ уже использовалось ранее - оно описывает одну или более цифр. А выражение \S+ описывает все символы, кроме whitespace (пробел, таб и другие).

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

Примечание

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