繁体   English   中英

Python - 正则表达式从snmp walk输出中提取IP和Mask

[英]Python - regex to extract IP and Mask from snmp walk output

我正在努力使用正则表达式从snmp walk输出中提取IP和子网掩码信息。 以下是输出的外观。

[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,

我已经将输出组织在不同的行中,因此很容易理解(我的代码中的实际输出是上面的没有行的输出):

[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>, 
<SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>, 
<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>, 
<SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,

因此每块之间,我们有子网掩码(值= '255.255.255.0')和IP地址(OID = 'iso.3.6.1.2.1.4.21.1.11。10.10.2.0')

我需要提取该信息并将其保存在数组/列表中,以便它看起来像这样:

(10.10.2.0/255.255.255.0, 10.0.0.0/255.255.255.192, and so on ...)

我相信正则表达式将是最好的解决方案,但尽管经过了数小时的研究和尝试,我似乎无法找到解决方案。

这是我到目前为止:

<some code omitted ..>
# contains SNMP output displayed above
print snmp_output
str_result = ''.join(str(snmp_output))
regex = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", str_result)
print regex

它给了我这个输出:

['255.255.255.0', '3.6.1.2', '1.4.21.1', '11.10.10.2', '255.255.255.192', '3.6.1.2', '1.4.21.1', '11.10.0.0', '255.255.255.0', and so on ...]

我想第一步就是走出去只给我掩码和IP而不是#s介于两者之间。

任何帮助将不胜感激。

谢谢达蒙

编辑:

for item in system_items:
    print '{oid}.{oid_index} {snmp_type} = {value}'.format(
        oid=item.oid,
        oid_index=item.oid_index,
        snmp_type=item.snmp_type,
        value=item.value

您可以使用以下正则表达式:

value='([\d.]+)'\s*\(oid='iso.*?\.(\d+\.\d+.\d+.\d+)'

演示

在python中:

>>> import re
>>> str = r"[<SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.2.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.192' (oid='iso.3.6.1.2.1.4.21.1.11.10.0.0.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.0' (oid='iso.3.6.1.2.1.4.21.1.11.10.10.10.0', oid_index='', snmp_type='IPADDR')>, <SNMPVariable value='255.255.255.252' (oid='iso.3.6.1.2.1.4.21.1.11.10.11.0.0', oid_index='', snmp_type='IPADDR')>,"
>>> re.findall(r"value='([\d.]+)'\s*\(oid='iso.*?\.(\d+\.\d+.\d+.\d+)'", str)
# => [('255.255.255.0', '10.10.2.0'), ('255.255.255.192', '10.0.0.0'), ('255.255.255.0', '10.10.10.0'), ('255.255.255.252', '10.11.0.0')]

然后你可以根据需要使用元组并将它们格式化为字符串。

要在你的问题中获得输出:

>>> import re
>>> regex = re.compile(r'(?:\d+\.){3}\d+$')
>>> tuple('{}/{}'.format(regex.search(item.oid).group(0), item.value)
...       for item in system_items)

我没有安装PySNMP ,但这是一个测试:

>>> class SNMPVariable(object):
...     def __init__(self, value, oid):
...         self.value = value
...         self.oid = oid
...         

>>> s1 = SNMPVariable('255.255.255.0', 'iso.3.6.1.2.1.4.21.1.11.10.10.2.0')

>>> s2 = SNMPVariable('255.255.255.252', 'iso.3.6.1.2.1.4.21.1.11.10.11.0.0')

>>> system_items = [s1, s2]

>>> tuple('{}/{}'.format(regex.search(item.oid).group(0), item.value)
...       for item in system_items)
...       
('10.10.2.0/255.255.255.0', '10.11.0.0/255.255.255.252')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM