为什么 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)
我正在尝试打印仅包含字母、数字、“-”和“_”且长度在 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)