2012-01-06 154 views
3

我有一个包含IP地址和DNS名称的字符串列表,我希望删除以“10”开头的值。只要。样本数据如下:从列表中删除字符串

['www.example.com','1.2.3.4','4.3.2.1','example.net','10.1.1.10','10.1.1.11',...]

我想这将是简单的,并开始与以下:

for v in address: 
    test = re.match('(^\d+\.)',v) 
    if test: 
     if test.group(1) == '10.': 
      address.remove(v) 

的“10”。尽管我没有收到任何错误(并且使用“print address.remove(v)”做了一些t-射击,导致每个“10.”地址的“无”),但是我并没有删除地址。让我相信这个正则表达式是错误,但它似乎工作,而不是在这种能力

所以我戳了re.purge() - 这并没有帮助,但不认为这是我的问题的一个因素。解决[...]无济于事。

我在哪里出了错?

非常感谢您的关注。

+0

当我测试你的代码,含有10.1的首地址被删除,而不是其他的。 – 2012-01-06 04:57:28

+0

[从列表中移除项目 - 在迭代过程中 - 此成语有什么问题?](http://stackoverflow.com/questions/2896752/removing-item-from-list-during-iteration-whats-wrong-with -this-idiom) – 2012-01-06 05:05:00

回答

14

最简单的方法是使用列表COMPR ehensions:

filtered = [ v for v in address if not v.startswith('10.') ] 
+0

虽然作为一对夫妇善意地指出根本问题在迭代时正在修改,但它仍然有效。迭代一个切片,修改原始文件就是要走的路 - 这种方法解决了我的问题。请参阅[链接](http://stackoverflow.com/questions/2896752/removing-item-from-list-during-iteration-whats-wrong-with-this-idiom)。 – 2012-01-06 05:35:41

+0

@BitBucket:N.B:实际上,链接的解决方案确实创建了该列表的一个副本并对其进行迭代。列表理解确实更高效(更不用说更容易理解)。 – Johnsyweb 2012-01-06 06:00:07

1

如果可能首先测试确实存在问题的IP地址。

否则10.some-cdn.some-mighty-corp.com将被过滤掉。

Related post

+0

当然,一旦“胆量”正在工作,这将被解释。了解我的数据源,发生这种情况的可能性极不可能。感谢您的意见。 – 2012-01-06 05:13:08