使用Lambda函数时出现语法错误

时间:2015-06-08 09:33:24

标签: python filter lambda

我有一个带有一些虚拟电子邮件地址的列表,如下所示:

listEmails = ['brian-23@email.com', 'britts_54@email.com', 'lara$@email.com']

我尝试使用lambdafilter来获取有效电子邮件地址列表。 我们假设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(是否会返回所需的结果。

2 个答案:

答案 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