- en
- Language: ru
- Documentation version: latest
Синтаксис регулярных выражений
В Python для работы с регулярными выражениями используется модуль re. Соответственно, для начала работы с регулярными выражениями надо его импортировать.
В этом разделе для всех примеров будет использоваться функция 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('MTU', int_line)
В этом примере:
сначала импортируется модуль 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('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('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('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.