2014-09-23 148 views
2

現在我通過映射一個新的列表來排除列表中的電子郵件,排除我不想要的東西。這看起來像:Python列表理解嵌套循環

pattern = re.compile('b\.com') 

    emails = ['[email protected]', '[email protected]', '[email protected]', '[email protected]'] 
    emails = [e for e in emails if pattern.search(e) == None] 
    # resulting list: ['[email protected]', '[email protected]'] 

不過,現在我需要過濾掉多個域,所以我也需要被過濾掉域的列表。

pattern_list = ['b.com', 'c.com'] 

有沒有辦法做到這一點仍然在列表理解形式,或者我將不得不恢復到嵌套for循環?

注意:在@處分割字符串並且執行word[1] in pattern_list將不起作用,因爲c.com也需要趕上sub.c.com

+0

我不喜歡列表理解是解決這個問題的最好方法 - 你可能可以做到,但是很麻煩。看看這個解決方案:http://stackoverflow.com/questions/19150208/python-search-regex-from-variable-inside-a-list – karthikr 2014-09-23 18:27:53

+0

請注意,你現有的例子也將排除,例如'[email protected] '和'bob.com @ bob.com'。那是你要的嗎? – BrenBarn 2014-09-23 18:28:28

+0

當你對列表解析進行列表解析時,通常最好使用生成器(將方括號改爲parens),它更高效地存儲內存並很好地鏈接在一起。 – Seth 2014-09-23 18:30:53

回答

2

有幾個方法可以做到這一點,即使不使用正則表達式。其一是:

[e for e in emails if not any(pat in e for pat in pattern_list)] 

這也將排除像[email protected][email protected]電子郵件,但這樣做你原來的解決方案。但是,它並不排除您現有解決方案所用的[email protected]等案例。再一次,目前尚不清楚您現有的解決方案是否確實按您的想法做了。

另一種可能性是將你的模式與rx = '|'.join(pattern_list)合併爲一個,然後在該正則表達式上匹配。但是,如果您只想匹配b.com作爲完整域(而不僅僅是域的一部分或作爲用戶名的一部分),則需要使用更復雜的正則表達式。