Python列表理解嵌套循环

时间:2014-09-23 18:24:12

标签: python arrays list list-comprehension

现在我"删除"通过映射新列表来排除列表中的电子邮件,排除我不想要的内容。这看起来像:

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

    emails = ['user@a.com', 'user@b.com', 'user@c.com', 'user@d.com']
    emails = [e for e in emails if pattern.search(e) == None]
    # resulting list:  ['user@a.com', 'user@c.com']

但是,现在我需要过滤掉多个域,因此我有一个需要过滤掉的域名列表。

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

有没有办法在列表理解表单中执行此操作,或者我将不得不恢复为嵌套for循环?

注意:在@上分割字符串并执行word[1] in pattern_list工作不会有效,因为c.com也需要抓住sub.c.com

2 个答案:

答案 0 :(得分:2)

import re

pattern = re.compile('b.com$|c.com$')

emails = ['user@a.com', 'user@b.com', 'user@c.com', 'user@d.com']

emails = [e for e in emails if pattern.search(e) == None]

print emails

这个怎么样

答案 1 :(得分:2)

即使不使用正则表达式,也有几种方法可以做到这一点。一个是:

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

这也会排除user@crumb.combob.com@bob.com等电子邮件,但原始解决方案也是如此。但是,它不会排除现有解决方案所做的user@bocom之类的情况。同样,目前还不清楚您现有的解决方案是否真的按照您的想法行事。

另一种可能性是将您的模式与rx = '|'.join(pattern_list)合并为一个,然后匹配该正则表达式。但是,如果您只想将b.com仅匹配为完整域(不仅仅是域的一部分或用户名的一部分),那么您还需要使用更复杂的正则表达式。