0

我正在尝试通过 Netmiko 获取 cisco 版本。

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”。

4

2 回答 2

0
>>> import re
>>> txt = "System image file is \"flash:/c2900-universalk9-mz.SPA.156-3.M6.bin"
>>> txt = re.search(r'["]flash:/(.*)["]',txt).group(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> print(txt)
System image file is "flash:/c2900-universalk9-mz.SPA.156-3.M6.bin
>>>
>>>

显然output不包含预期的内容。
没有比赛。该对象是一个NULL。

首先测试比赛:

import re
txt = "System image file is \"flash:/c2900-universalk9-mz.SPA.156-3.M6.bin\""
match = re.search(r'["]flash:/(.*)["]',txt)
if ( match ) :
    print(match.group(1))
else :
    print("No match")
于 2019-12-11T20:07:52.197 回答
0

该方法re.match(..)返回Match对象(具有.group(x)方法等),或者None如果未找到匹配项。在您的情况下,错误意味着已返回None;)

好的,这意味着正则表达式模式不适用于测试的数据。我已经调试了你的两种情况,我注意到在第一个脚本中你应用了模式,is "flash:c2900-但是在第二个例子中你正在测试正则表达式file is \"flash:/c2900,我们flash:有一个在第一个例子中不存在c2900的额外内容/.

好的,所以有两种方法可以修复它 - 如果您想使用和不/使用相同的正则表达式来处理它,它将是这种方式

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))
于 2019-12-11T20:55:04.867 回答