现在我"删除"通过映射新列表来排除列表中的电子邮件,排除我不想要的内容。这看起来像:
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
。
答案 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.com
和bob.com@bob.com
等电子邮件,但原始解决方案也是如此。但是,它不会排除现有解决方案所做的user@bocom
之类的情况。同样,目前还不清楚您现有的解决方案是否真的按照您的想法行事。
另一种可能性是将您的模式与rx = '|'.join(pattern_list)
合并为一个,然后匹配该正则表达式。但是,如果您只想将b.com
仅匹配为完整域(不仅仅是域的一部分或用户名的一部分),那么您还需要使用更复杂的正则表达式。