Vau*_*ein 3 python lambda filter
我有一个带有一些虚拟电子邮件地址的列表如下:
listEmails = ['brian-23@email.com', 'britts_54@email.com', 'lara$@email.com']
Run Code Online (Sandbox Code Playgroud)
我试图使用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))
Run Code Online (Sandbox Code Playgroud)
我已经在陆续收到一个语法错误,之前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])
Run Code Online (Sandbox Code Playgroud)
所以,我想知道为什么它不适合我的情况?
注意:由于我在lambda函数本身出错,我没有评估是否list(filter(会返回所需的结果.
您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)