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

Vau*_*ein 3 python lambda filter

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

listEmails = ['brian-23@email.com', 'britts_54@email.com', 'lara$@email.com']
Run Code Online (Sandbox Code Playgroud)

我试图使用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))
Run Code Online (Sandbox Code Playgroud)

我已经在陆续收到一个语法错误,之前listEmails)).

一般来说,lambda函数取值逗号(后,)作为输入值,所以我不知道,如果lambda功能是假设xre.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])
Run Code Online (Sandbox Code Playgroud)

所以,我想知道为什么它不适合我的情况?

注意:由于我在lambda函数本身出错,我没有评估是否list(filter(会返回所需的结果.

Mar*_*ers 8

else在条件表达式中缺少一个子句:

x if re.match(...) else None
Run Code Online (Sandbox Code Playgroud)

你不能单独使用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))
Run Code Online (Sandbox Code Playgroud)

在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)]
Run Code Online (Sandbox Code Playgroud)

我将编译后的正则表达式存储在一个单独的变量中,以使其更具可读性:

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)]
Run Code Online (Sandbox Code Playgroud)

  • @Vaulstein:`pass`不是表达式,它是一个声明.你只能在`lambda`中使用表达式.`pass`意味着*什么都不做*,而你*有*做某事.`None`将是一个合适的返回对象. (3认同)