Используя регулярные выражения, получить значения и создать словарь - PullRequest
0 голосов
/ 16 апреля 2020

Первый раз публикуя текущие сведения о Python.

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

set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24
set interfaces ge-0/0/1 unit 0 family inet dhcp
set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30
set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30

Используя модуль re (findall), я нахожу и сопоставляю некоторые ключевые слова, которые мне нужны, например:

pattern1 = re.compile(r'ge.{1,7}')
pattern2 = re.compile(r'dhcp')
matched1 = pattern1.findall(interfaces)
matched2 = pattern2.findall(interfaces)

На данный момент вопрос is: Если строка (?) этого выхода маршрутизатора содержит слово «dhcp», я хотел бы сохранить / сохранить это значение и получить имя / номер интерфейса тоже. В приведенном выше примере интерфейс, содержащий «dhcp», представляет собой «ge-0/0/1». Ребята, у вас есть идея, если я иду по правильному пути?

  • Полезна ли модель (получить два регулярных выражения), чтобы затем объединить оба значения в словарь, а затем распечатать с помощью return?
  • Как можно проанализировать остальные строки кода маршрутизатора, чтобы найти это значение "dhcp", а затем, если никакое совпадение не может вернуть вывод "none" или "not present"?

Ожидаемый вывод будет выглядеть следующим образом (я использую «табулирование возврата», чтобы напечатать вывод):

| interface   | service    |
|-------------+------------|
| ge-0/0/0    |  none      | 
| ge-0/0/1    |  dhcp      | 
| ge-0/0/2    |  none      |

Любые указания будут приветствоваться. Спасибо.


РЕДАКТИРОВАТЬ: Спасибо оба за ваши ответы до сих пор. Я добавляю больше информации, так как, вероятно, это ключ. То, как я получаю этот маршрутизатор, использует встроенные модули SaltStack. Я запускаю этот файл python из Salt Master, используя следующий синтаксис:

interfaces = __salt__['net.cli']('show configuration interfaces | display set', format='xml')['out']['show configuration interfaces | display set']

Я искренне надеюсь, что вывод на самом деле является списком.

Тем временем я сделал еще одну попытку, используя следующее:

def dhcp():

interfaces = __salt__['net.cli']('show configuration interfaces | display set', format='xml')['out']['show configuration interfaces | display set']

pattern = re.findall(r'ge.{1,7}', interfaces)
pattern1 = re.findall(r'dhcp', interfaces)

return pattern, pattern1 

Вывод был такой:

outright ~  sudo salt 'vsrx1' red.dhcp
vsrx1:
 |_
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/0 
   - ge-0/0/1 
   - ge-0/0/2 
   - ge-0/0/2 
 |_
   - dhcp

Печать только списка (с помощью -> return ("List is:" + str ( шаблон)))

 outright ~  sudo salt 'vsrx1' red.dhcp
 vsrx1:
 List is: ['ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/0 ', 'ge-0/0/1 ', 'ge-0/0/2 ', 'ge-0/0/2 ']

Прошу прощения, если путь к express технически беден. Я все еще изучаю терминологию в целом.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Мне кажется, что вы на правильном пути. Вот моя интерпретация того, о чем я думаю, вы просите. Надеюсь это поможет. Примечание: я сделал это через свой телефон, поэтому прошу прощения за неправильные отступы

import re

s = ["set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24",
"set interfaces ge-0/0/1 unit 0 family inet dhcp", "set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30", 
"set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30"]

print("interfaces | services")
mydict ={}
def parse_addresses():
    for i in s:
            interface = re.search(r"ge.{1,7}", i)
            if "dhcp" in i:
                service = "dhcp"
                mydict.setdefault("router",{interface.group(): service})
            else:
                service = "None"
            print(f"{interface.group()} | {service}")
    if bool(mydict):
        return mydict
    return "None"

print(parse_addresses())
0 голосов
/ 16 апреля 2020

Я не уверен, как вы получаете вывод маршрутизатора. Но это должно работать, если ваши данные в этой форме

interface_list = ['set interfaces ge-0/0/0 unit 0 family inet address 192.168.15.66/24',
'set interfaces ge-0/0/1 unit 0 family inet dhcp',
'set interfaces ge-0/0/2 unit 0 family inet address 1.1.1.1/30',
'set interfaces ge-0/0/2 unit 0 family inet address 192.168.99.1/30']

Тогда

interface_dict = {}
for element in interface_list:
    element_list = element.split(" ")
    if element_list[7] =='dhcp':
        interface_dict[element_list[2]] = 'dhcp'
    else:
        interface_dict[element_list[2]] = 'none'
print(interface_dict)

даст вам

{'ge-0/0/0': 'none', 'ge-0/0/1': 'dhcp', 'ge-0/0/2': 'none'}

Вы можете затем измените словарь на фрейм данных

import pandas as pd

df = pd.Series(interface_dict).to_frame().reset_index().rename(columns={'index':'interface', 0:'service'})
df 
    interface   service
0   ge-0/0/0    none
1   ge-0/0/1    dhcp
2   ge-0/0/2    none

...