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

标签 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( 是否会返回所需的结果。

最佳答案

条件表达式中缺少 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/

相关文章:

python - 向整数列表中的每个值添加一个整数

java - 使用apache poi从Excel文件的特定列中过滤特定的单元格值?

c++ - 使用 lambda 和 constexpr-if 初始化静态 bool 会给出地址错误

java - 如何使用 peek 或 anyMatch 返回对象而不是流

list - 我应该如何删除列表中的非数字使用序言

C++ Lambda 函数闭包 - 内存问题

python - 正在寻找可能更好的方法来使用 Glom 获取嵌套数据?

python - 从多个文件中搜索和排序数据

python - 任意尺寸的 Numpy 切片

r - 在 R 中使用过滤器功能。需要为赛马数据库分配 NA 并保持数据集的长度相同