#python #special-characters #alphanumeric
Вопрос:
Я пытаюсь напечатать имена пользователей, которые содержат только буквы, цифры, » — » и «_» и имеют длину от 3 до 16 символов.
usernames = input().split(', ') for word in usernames: if 3 lt;= len(word) lt;= 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
Почему это так?
Комментарии:
1. Вы используете генератор
(c for c in word if (c.isalnum() or c == '_' or c == '-'))
в качестве условия. Это не проверка каждого элемента в генераторе. Объект генератора является истинным, поэтому ваше условие истинно.2. Это выражение создает список, содержащий все символы, соответствующие этим критериям. Это логическое значение будет истинным, если хотя бы одна буква соответствует вашим критериям.
3.
all(True if (c.isalnum() or c == '_' or c == '-') else False for c in word )
Учитывая, что в ваших текущих условиях невозможно вернуть значение false, если в слове присутствуют недопустимые символы
Ответ №1:
(c for c in word if (c.isalnum() or c == '_' or c == '-'))
это генератор, содержащий все эти символы. Все генераторы правдивы, так что на самом деле это ничего не проверяет.
Используйте all()
функцию, чтобы проверить, соответствуют ли все символы этим критериям. И тогда нет необходимости проверять ' ' not in word
, так как это не соответствует этим критериям.
if 3 lt;= len(word) lt;= 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)