为什么Python用户名过滤代码会输出@等不符合规则的特殊字符?
问题原因分析
- 核心错误出在字符校验的条件逻辑:你写的
(c for c in word if (c.isalnum() or c == '_' or c == '-'))是生成器表达式,在Python中,任意非空的生成器对象的布尔判断结果都是True,完全不会执行你预期的「所有字符都符合规则」的校验逻辑,相当于这个校验条件直接失效,因此带特殊符号的@smith也能通过判断。 - 额外冗余判断:你添加的
' ' not in word条件没有必要,只要字符校验逻辑正确,空格本身就不属于允许的字符范围,会被直接过滤。
修复后的代码
usernames = input().split(', ') for word in usernames: if 3 <= len(word) <= 16 and all(c.isalnum() or c in ('_', '-') for c in word): print(word)
逻辑说明
- 用
all()函数包装生成器表达式,只有遍历word的所有字符都满足「是字母/数字/是_/是-」的要求时,才会返回True,否则直接返回False阻断后续逻辑。 - 修复后运行你提供的测试输入,输出结果完全符合预期。
内容的提问来源于stack exchange,提问作者prsnr
相关产品推荐
相关产品推荐

