Python邮件地址验证代码问题求助:合法邮件被误判无效
邮件验证代码问题分析及修复
核心问题1:has_invalid_characters函数逻辑错误
你的这个函数只检查字符串的第一个字符就直接返回结果,完全忽略了后续字符的验证:
for i in string: if i not in valid: return True else: return False
比如验证test时,第一个字符t是有效的,函数直接返回False,但如果后续有无效字符(比如te#st),函数根本不会检查到。正确逻辑应该是:遍历所有字符,发现无效字符就返回True;全部遍历完成后确认都有效,才返回False。
核心问题2:循环中未正确处理验证结果
你在遍历邮件列表时,调用is_valid(i)但没有保存返回值,直接判断i == True——i是字符串,永远不可能等于布尔值True,导致所有邮件都被判定为无效。
额外优化点(非直接报错原因)
原代码限制域名必须恰好有一个点,但实际合法域名可能包含多个子域名(比如test@sub.example.com),可以放宽为域名至少包含一个点,且不能以点开头/结尾。
修正后的完整代码
def has_invalid_characters(string): valid = "abcdefghijklmnopqrstuvwxyz0123456789." for char in string: if char not in valid: return True # 遍历完所有字符都有效,返回False return False def is_valid(email): if email.count("@") != 1: return False prefix, domain = email.split("@") if len(prefix) == 0: return False # 域名需包含至少一个点,且不能以点开头/结尾 if "." not in domain or domain.startswith(".") or domain.endswith("."): return False if has_invalid_characters(prefix): return False if has_invalid_characters(domain): return False return True emails = [ "test@example.com", "valid@gmail.com", "invalid@gmail", "invalid", "not an email", "invalid@email", "!@/", "test@@example.com", "test@.com", "test@site.", "@example.com", "an.example@test", "te#st@example.com", "test@exam!ple.com" ] for email in emails: is_valid_email = is_valid(email) if is_valid_email: print(f"{email} is valid") else: print(f"{email} is invalid")
内容的提问来源于stack exchange,提问作者makeeley
相关产品推荐
相关产品推荐

