仅搜索完全匹配

时间:2017-07-25 17:19:10

标签: python networking

所以,我有一个非常长的列表(示例截断),其值看起来像这样:

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一起返回。我想象必须有一种方法可以强制它回到我的输入......

1 个答案:

答案 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))作为条件。