我有一个包含一些虚拟电子邮件地址的列表,如下所示:
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(
是否会返回所需的结果。
最佳答案
条件表达式中缺少 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)]
关于python - 使用 Lambda 函数时出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705624/