Извлечение MAC-адреса, расположенного между 'link / ether & brd' - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь получить только MAC-адрес , который находится между link/ether и brd.

Вот код, который у меня пока есть, является частью большого файла и включает в себя пример:

import re
data = '''1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:25:b5:12:02:00 brd ff:ff:ff:ff:ff:ff '''
p = re.compile(r'(?:[0-9a-fA-F]:?){12}')
re.findall(p, line)

Удалось получить следующий вывод:

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
link/ether 00:15:b8:12:09:00 brd ff:ff:ff:ff:ff:ff

Проблема: я пытаюсь получить следующий вывод (из каждой строки, начинающейся с link/ether, чтобы получить MAC-адрес, который находится между link/ether & brd):

00:15:b8:12:09:00

1 Ответ

2 голосов
/ 01 апреля 2019

Вы можете использовать

 p = re.compile(r'^\s*link/ether\s+([0-9a-fA-F]+(?::[0-9a-fA-F]+){5})\s+brd', re.M)

См. Демоверсию regex и график Regulex :

enter image description here

Детали

  • ^ - начало строки
  • \s* - 0+ пробелов
  • link/ether - буквальная подстрока
  • \s+ - 1+ пробелов
  • ([0-9a-fA-F]+(?::[0-9a-fA-F]+){5}) - Захват группы 1 (что возвращает re.findall): 1 или более шестнадцатеричных символов, за которыми следуют 5 вхождений :, за которыми следуют 1+ шестнадцатеричных символов
  • \s+ - 1+ пробелов
  • brd - brd подстрока.

См. Демоверсию Python :

import re
data = '''1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:25:b5:12:02:00 brd ff:ff:ff:ff:ff:ff '''
p = re.compile(r'^\s*link/ether\s+([0-9a-fA-F]+(?::[0-9a-fA-F]+){5})\s+brd', re.M)
print(p.findall(data)) # => ['00:25:b5:12:02:00']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...