为什么 Python 打印特殊字符 @#$ 等,而我明确表示不要这样做?

Why Python prints special characters @#$ etc. when I specifically said not to do so?

我正在尝试打印仅包含字母、数字、“-”和“_”且长度在 3 到 16 个字符之间的用户名。

usernames = input().split(', ')

for word in usernames:
    if 3 <= len(word) <= 16 and (c for c in word if (c.isalnum() or c == '_' or c == '-')) and ' ' not in word:
        print(word)

输入:

Jeff, john45, ab, cd, peter-ivanov, @smith

输出必须是:

Jeff
John45
peter-ivanov

而是:

Jeff
john45
peter-ivanov
@smith

为什么会这样?

(c for c in word if (c.isalnum() or c == '_' or c == '-')) 是一个包含所有这些字符的生成器。所有生成器都是真实的,所以这实际上并没有检查任何东西。

使用all() 函数来测试是否所有字符都符合该条件。然后就不需要检查 ' ' not in word,因为它不符合这个条件。

    if 3 <= len(word) <= 16 and all(c.isalnum() or c == '_' or c == '-' for c in word):

您也可以使用正则表达式:

import re

for word in usernames:
    if re.match(r'[\w-]{3,}$', word):
        print(word)