2012-07-07 18 views
0

是否可以刪除列表中不包含正則表達式字符串的所有項目?刪除列表中不包含正則表達式字符串的所有項目

我在想也許只返回一個正則表達式字符串,如果沒有一個,使列表項爲空,然後第二次遍歷列表刪除所有空條目,但這似乎效率低下。

有什麼想法?

例如,可以說我有:

["cat", "dog", "monkey", "Fred", "sad"] 

,我寫一個正則表達式,只有選擇對悲傷。我希望所有其他人都(最好)被刪除。

+0

你需要重寫你的問題,以更清晰關於你想要什麼。你在尋找正則表達式和字符串之間的一對一匹配嗎?或者你是否試圖用每個正則表達式(笛卡爾積)來測試每個字符串? – 2012-07-08 01:59:56

+0

好的,我有一個單詞列表。我想通過這個列表,並將其與另一個短語列表進行比較,並檢查第一個列表中的任何單詞是否在第二個列表中,並記錄每個單詞的發生次數。 – 2012-07-08 16:02:56

回答

8

做到這一點,最簡單的方法是使用列表理解來構建一個新的列表:

regex = re.compile(...) 
new_list = [s for s in old_list if regex.match(s)] 

,或者使用filter()

new_list = filter(regex.match, old_list) 
+0

這是代碼:wordlist = ['sad','mad','im','cats','dogs','goats'] new_list = [s for s in tweets if re.match(wordlist)] print new_list – 2012-07-08 00:00:24

+0

獲取「match()至少需要2個參數」 – 2012-07-08 00:00:40

+0

哦,等等,看着.compile - 你不能編譯列表。 – 2012-07-08 00:06:52

2
import re 
filters  = ['^sad', '^.*ed$'] 
expressions = [re.compile(x) for x in filters] 
words   = ['cat', 'dog', 'monkey', 'fred', 'sad', 'saddening'] 
filtered_list = [s for s in words if any(re.match(s) for re in expressions)] 

輸出:

['fred', 'sad', 'saddening'] 
相關問題