• en
  • Language: ru
  • Documentation version: latest

Функция 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(r'Host \S+ '
   ...:                  r'in vlan (\d+) '
   ...:                  r'is flapping between port '
   ...:                  r'(\S+) and port (\S+)', log)
   ...:

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

In [6]: print(match)
None

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

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

In [4]: match = re.match(r'\S+: Host \S+ '
   ...:                  r'in vlan (\d+) '
   ...:                  r'is flapping between port '
   ...:                  r'(\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 = (r'\S+: Host \S+ '
         r'in vlan (\d+) '
         r'is flapping between port '
         r'(\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