我试图过滤掉有效的电子邮件地址,但我收到以下错误。
Traceback (most recent call last):
File "C:/Python27/ghhs.py", line 20, in <module>
valid=list(filter(a,email)) TypeError: 'bool' object is not callable
以下是代码:
def fun(email):
for i in email:
if ('@'and'.') in i:
user,url=i.split('@')
web,domain=url.split(".")
if user.replace('-','').replace('_','').isalnum() is False:
return False
elif web.isalnum() is False:
return False
elif len(domain)>3:
return False
else:
return True
else:
return True
if __name__=="__main__":
n=int(input())
email=[raw_input() for i in range(n)]
a=fun(email)
valid=list(filter(a,email))
valid.sort()
print (valid)
答案 0 :(得分:1)
filter
的第一个参数应该是为第二个参数中的每个项调用的函数,但是您首先调用该函数并传入返回值。将过滤器调用更改为以下内容:
valid=list(filter(fun, email))
<强> ETA 强>
正如下面的评论中所指出的,fun
还有其他一些问题。从一个,因为传递给filter
的函数被调用每个项目,它不应该尝试循环其输入,而只是接受一个电子邮件地址而不是地址列表。
此外,您对地址中字符的初始测试也会被破坏。这样的事情会更好:
def fun(email):
if ('@' in email) and ('.' in email):
user, url = i.split('@')
web, domain = url.split(".")
if user.replace('-','').replace('_','').isalnum() is False:
return False
elif web.isalnum() is False:
return False
elif len(domain)>3:
return False
else:
return True
但更好的是,不要重新发明wheel:
from validate_email import validate_email
valid = list(filter(validate_email, email))