re.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