所以,我有一个非常长的列表(示例截断),其值看起来像这样:
derp = [[('interface_name', 'interface-1'), ('ip_address', '10.1.1.1'), ('mac_address', 'xx:xx:xx:xx:xx:xx')], [('interface_name', 'interface 2'), ('ip_address', '10.1.1.2'), ('mac_address', 'xx:xx:xx:xx:xx:xx')], [('interface_name', 'interface 3'), ('ip_address', '10.1.1.11'), ('mac_address', 'xx:xx:xx:xx:xx:xx')]]
我的功能通过那个庞大的列表,只是基于IP拉出一个匹配,但问题是,它似乎匹配最后一个八位字节中的任何内容,而不仅仅是完全匹配。
findIP = sys.argv[1]
def arpInt(arp_info):
for val in arp_info:
if re.search(findIP, str(val)):
interface = val.pop(0)
string = val
print string, interface[1]
arpInt(derp)
所以在上面的例子中,如果findIP =' 10.1.1.1'它将与10.1.1.1和10.1.1.11一起返回。我想象必须有一种方法可以强制它回到我的输入......
答案 0 :(得分:0)
不要使用正则表达式。只需查找字符串本身。
data = [[('interface_name', 'interface-1'),
('ip_address', '10.1.1.1'),
('mac_address', 'xx:xx:xx:xx:xx:xx')],
[('interface_name', 'interface-1a'),
('ip_address', '010.001.001.001'),
('mac_address', 'xx:xx:xx:xx:xx:xx')],
[('interface_name', 'interface 2'),
('ip_address', '10.1.1.2'),
('mac_address', 'xx:xx:xx:xx:xx:xx')],
[('interface_name', 'interface 3'),
('ip_address', '10.1.1.11'),
('mac_address', 'xx:xx:xx:xx:xx:xx')]]
key = '10.1.1.1'
for interface, ip, mac in data:
if key in ip:
#print(interface, ip)
print([interface, ip, mac], interface[1])
当然只有在数据中的ip地址符合您的示例时才有效...没有前导零。
如果你的地址可能有前导零,你可以比较地址的等价整数
key = '10.1.1.1'
key = map(int, key.split('.'))
for interface, ip, mac in data:
ip_address = ip[1]
ip_address = map(int, ip_address.split('.'))
if ip_address == key:
#print(interface, ip)
print([interface, ip, mac], interface[1])
我在这台计算机上没有Python 3.x,所以我不知道地图对象是否可以这样比较。如果没有,请使用all(a == b for a, b in zip(ip_address, key))
作为条件。