Книга: PyNEng
Назад: re.search
Дальше: re.finditer

re.match

re.match()

Функция match():

  • используется для поиска в начале строки подстроки, которая соответствует шаблону
  • возвращает объект Match, если подстрока найдена
  • возвращает None, если подстрока не найдена

Функция match отличается от search тем, что match всегда ищет совпадение в начале строки. Например, если повторить пример, который использовался для функции search, но уже с match:

In [2]: import re  In [3]: log = '%SW_MATM-4-MACFLAP_NOTIF: Host 01e2.4c18.0156 in vlan 10 is flapping between port Gi0/16 and port Gi0/24'  In [4]: match = re.match('Host \S+ '    ...:                  'in vlan (\d+) '    ...:                  'is flapping between port '    ...:                  '(\S+) and port (\S+)', log)    ...: 

Результатом будет None:

In [6]: print(match) None 

Так получилось из-за того, что match ищет слово Host в начале строки. Но это сообщение находится в середине.

В данном случае можно легко исправить выражение, чтобы функция match находила совпадение:

In [4]: match = re.match('\S+: Host \S+ '    ...:                  'in vlan (\d+) '    ...:                  'is flapping between port '    ...:                  '(\S+) and port (\S+)', log)    ...: 

Перед словом Host добавлено выражение \S+:. Теперь совпадение будет найдено:

In [11]: print(match) <_sre.SRE_Match object; span=(0, 104), match='%SW_MATM-4-MACFLAP_NOTIF: Host 01e2.4c18.0156 in >  In [12]: match.groups() Out[12]: ('10', 'Gi0/16', 'Gi0/24') 

Пример аналогичен тому, который использовался в функции search, с небольшими изменениями (файл parse_log_match.py):

import re  regex = ('\S+: Host \S+ '          'in vlan (\d+) '          'is flapping between port '          '(\S+) and port (\S+)')  ports = set()  with open('log.txt') as f:     for line in f:         match = re.match(regex, line)         if match:             vlan = match.group(1)             ports.add(match.group(2))             ports.add(match.group(3))  print('Петля между портами {} в VLAN {}'.format(', '.join(ports), vlan)) 

Результат:

$ python parse_log_match.py Петля между портами Gi0/19, Gi0/24, Gi0/16 в VLAN 10 
Назад: re.search
Дальше: re.finditer