Python-regex从snmp输出中提取IP和掩码

Python-regex从snmp输出中提取IP和掩码,python,regex,python-2.7,ip-address,snmp,Python,Regex,Python 2.7,Ip Address,Snmp,我正在努力使用正则表达式从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', o

我正在努力使用正则表达式从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')>,
我相信正则表达式是最好的解决方案,但尽管我花了很多时间进行研究和尝试,但似乎还是找不到解决方案

以下是我到目前为止的情况:

<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
我想第一步应该是出去,只给我面具和IP,而不在两者之间

任何帮助都将不胜感激

谢谢 达蒙

编辑:


您可以使用以下regexp:

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')]
>>重新导入
>>>str=r“[,,”
>>>re.findall(r“value=”([\d.]+)”\s*\(oid='iso.*?\。(\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')

@布拉德·所罗门,我想我不能回答第二个问题,但第一个问题,我看了文档,发现了一些有用的东西。请看我的编辑
value='([\d.]+)'\s*\(oid='iso.*?\.(\d+\.\d+.\d+.\d+)'
>>> 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)
>>> 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')