2012-01-06 198 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