Синтаксис регулярных выражений#
В 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.