AttributeError: у объекта 'NoneType' нет атрибута 'группа', - PullRequest
0 голосов
/ 11 декабря 2019

Я пытаюсь получить версию Cisco от Netmiko.

import re
from netmiko import ConnectHandler

iosv_l3 = {
    'device_type': 'cisco_ios',
    'ip': 'my ip',
    'username': 'username',
    'password': 'password',
    'secret': 'enable password'
}

net_connect = ConnectHandler(**iosv_l3)
net_connect.enable()
output = net_connect.send_command('show version | include flash')
print(output)
x = re.search(r'["]flash:/(.*)["]',output).group(1)
print(x)
net_connect.disconnect()

Netmiko может успешно выполнить SSH к оборудованию Cisco. Я могу увидеть вывод из print (output):

System image file is "flash:c2900-universalk9-mz.SPA.156-3.M6.bin"

Однако код приводит к ошибке:

x = re.search(r'["]flash:/(.*)["]',output).group(1)
AttributeError: 'NoneType' object has no attribute 'group'

Я создал тестовый файл для проверки регулярных выражений:

import re
txt = "System image file is \"flash:/c2900-universalk9-mz.SPA.156-3.M6.bin\""
txt = re.search(r'["]flash:/(.*)["]',txt).group(1)
print(txt)

Тестовая печать "c2900-universalk9-mz.SPA.156-3.M6.bin" правильно.

1 Ответ

0 голосов
/ 11 декабря 2019

Метод re.match(..) возвращает Match объект (который имеет .group(x) методы и т. Д.) Или None в случае, если совпадение не было найдено. В вашем случае ошибка означает, что было возвращено None;)

Хорошо, это означает, что шаблон регулярных выражений не работает для протестированных данных. Я отлаживал оба ваших случая и заметил, что в первом сценарии вы применяете шаблон к is "flash:c2900-, но во втором примере вы проверяете регулярное выражение для file is \"flash:/c2900, где между flash: и c2900 мыиметь дополнительный /, которого нет в первом примере.

Хорошо, так что есть 2 способа исправить это - если вы хотите работать с и без /, используя одно и то же регулярное выражение,так будет

import re

output = 'System image file is "flash:c2900-universalk9-mz.SPA.156-3.M6.bin"'
print(re.search(r'"flash:/?(.*)"', output).group(1))

output = 'System image file is "flash:/c2900-universalk9-mz.SPA.156-3.M6.bin"'
print(re.search(r'"flash:/?(.*)"', output).group(1))

с использованием необязательного сопоставления регулярных выражений (?).

Если вы хотите работать только с / или без, вы можете использовать эти примеры.

import re

output = 'System image file is "flash:c2900-universalk9-mz.SPA.156-3.M6.bin"'
print(re.search(r'"flash:(.*)"', output).group(1))

output = 'System image file is "flash:/c2900-universalk9-mz.SPA.156-3.M6.bin"'
print(re.search(r'"flash:/(.*)"', output).group(1))
...