我有一个带有一些虚拟电子邮件地址的列表,如下所示:
listEmails = ['brian-23@email.com', 'britts_54@email.com', 'lara$@email.com']
我尝试使用lambda
和filter
来获取有效电子邮件地址列表。
我们假设lara$@email.com
是唯一无效的电子邮件地址。
我使用正则表达式使用以下代码过滤掉无效的电子邮件。
listValid = list(filter(lambda x: x if re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$",x) ,listEmails))
我在,
之前listEmails))
收到语法错误。
通常,lambda
函数将逗号(,
)后的值作为输入值,因此我不确定lambda
函数是否正常从x
假设re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$",x)
作为输入值。
具有if
条件的Lambda函数可以从以下情况开始:
from functools import reduce
f = lambda a,b: a if (a > b) else b
reduce(f, [47,11,42,102,13])
所以,我想知道为什么它不适用于我的情况?
注意:由于我在lambda
函数本身出错,我没有评估list(filter(
是否会返回所需的结果。
答案 0 :(得分:8)
您在条件表达式中缺少 else
子句:
x if re.match(...) else None
你不能单独使用if
;所有表达式总是产生一个结果,所以如果re.match()
返回None
,你需要决定应该返回什么而不是。
您根本不需要条件表达式,只需返回re.match()
调用的结果:
listValid = list(filter(lambda x: re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$", x), listEmails))
在Python 3中,使用列表推导而不是filter()
通常更容易:
listValid = [x for x in listEmails if re.match(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$", x)]
我将已编译的正则表达式存储在一个单独的变量中,以使其更具可读性:
email_test = re.compile(r"^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]{0,3}$")
listValid = [x for x in listEmails if email_test.match(x)]
答案 1 :(得分:3)
您缺少三元表达式中的else
部分。
正如你所说:
a if a > b else b