2014-09-05 53 views
0

什么是: 正在使用Python 2.7。Filterig /删除/排除来自嵌套列表的端口的私有IP

我正在使用virustotal API以列表格式生成IP列表。当我在对象上运行type()时,它返回列表。底部是数据的一个例子。有什么办法可以制作过滤器,正则表达式列表理解或通配符系统来删除以10开头的所有IP。172.16-172.31和192.168?

原因:

有一些常见的IP的是那些获得从报告中产生的,但他们对我没用。我做了一个列表理解来过滤掉特定的地址,但是列表正在不断增加,并且它很快变得明显,列表中排除主列表会减慢速度。我想删除所有没有重要的IP,所以我不会放慢我的脚本无用的提交到它的数据库。

如何:

unique = [xte for xte in unique if xte not in fil2] 

fil2 = [['255.255.255.255',67],['137.170.185.211',123],['213.186.33.99',53],['10.0.2.15',68]] 

举例:数据:

>>> fil2 = [['255.255.255.255',67],['137.170.185.211',123],['213.186.33.99',53],['10.0.2.15',68]] 
>>> type(fil2) 
<type 'list'> 
+1

另外看到的['ipaddress'](https://docs.python.org/3/library/ipaddress.html)模块标准库(Python 3.3+)或['netaddr'](https://pypi.python.org/pypi/netaddr)包(Python <3.3)。 – 2014-09-05 14:00:17

回答

0

你可以这样做:

dont_start_with_these = ('10.', '172.16.', '172.31.', '192.168') 

filtered_ip = [ip for ip in fil2 if not ip[0].startswith(dont_start_with_these)] 

编辑:这是一个更紧凑的解决方案,通过维斋

所建议
+0

这看起来很有希望,但我不断收到这个错误,“AttributeError:'列表'对象没有属性'startswith'”,好材料以后的参考。 – 2014-09-05 13:57:31

+0

已更新,但Vizjerei答案一旦修复,则更为紧凑。 – Germano 2014-09-05 14:00:07

+0

我最终选择了这个选项,但Vizjrei看起来非常棒,非常感谢你,我会尽快回复。它奇妙地工作。 – 2014-09-05 15:01:27

0

如何做一个列表的理解,并作出startswith像:

ips = [ip for ip in file2[0] if not str(ip[0]).startswith(('192.168.','10.','172.16.','172.31.')) ] 
+0

Jeez,我从来没有想到'startswith'接受一个元组。对我感到羞耻。尽管你应该添加一些括号。此外,您应该为最后两个前缀添加一个点,否则它们会过滤出超出预期的结果。 – Germano 2014-09-05 13:58:36

+0

我可以很好地认识到这一点,但我得到这个错误。我看到的列表理解越多,我越享受他们的效用。 TypeError:'int'对象没有属性'__getitem__' – 2014-09-05 13:58:48

+0

编辑它希望它现在可以工作。 – Vizjerei 2014-09-05 14:02:00