Проверки строки: isdigit, isalpha и валидация ввода
Методы-вопросы: строка состоит только из цифр? только из букв? всё в нижнем регистре? Учимся валидировать ввод пользователя одним вызовом.
Редакция Питоники
Методы этого урока не меняют строку и ничего не ищут — они задают вопросы и отвечают строго True или False. Из цифр ли строка? Из букв? Всё в нижнем регистре? Такие методы-вопросы удобны тем, что влезают прямо в условие if и делают код читаемым как предложение.
isdigit: состоит ли из цифр
isdigit отвечает True, если строка непустая и состоит только из цифр. Классический сценарий — форма или чат-бот: пользователь должен ввести число, но вводит текст. Проверка до преобразования спасает от ValueError, о котором писали в уроке про разбор строк.
user_input = '42'
if user_input.isdigit():
number = int(user_input)
print('Принято:', number * 2)
else:
print('Нужны только цифры')
bad_input = '42 года'
print(bad_input.isdigit())
Принято: 84 False
isalpha и isalnum: буквы и буквоцифры
isalpha — только буквы (русские тоже считаются), isalnum — буквы ИЛИ цифры (alnum = alpha + numeric). Имя пользователя, артикул товара, номер паспорта — всё это проверяется одним вызовом вместо кучи условий.
login = 'АннаСмирнова'
print(login.isalpha())
article = 'A17B'
print(article.isalnum())
login_2026 = 'Анна2026'
print(login_2026.isalpha(), login_2026.isalnum())
True True False True
Регистр и пробелы: islower, isspace
islower и isupper проверяют, что все буквы в соответствующем регистре (цифры и знаки не мешают — важны только буквы). isspace отвечает, состоит ли строка целиком из «пустых» символов: пробелов, переводов строки, табуляций. Последнее полезно, чтобы отсеять ввод из одних пробелов — глазу он кажется пустым, а len у него не ноль.
print('annasmirnova'.islower())
print('Анна2026'.isupper())
views_only = ' '
print(len(views_only), views_only.isspace())
True False 5 True
| Метод | True, если строка | Пример |
|---|---|---|
| isdigit | Только цифры, непустая | '42' → True, '42 года' → False |
| isalpha | Только буквы | 'Анна' → True, 'Анна1' → False |
| isalnum | Буквы или цифры | 'A17' → True |
| islower / isupper | Весь регистр нижний/верхний | 'мир' → True |
| isspace | Только «пустые» символы | ' ' → True |
Проверки собираются в цепочки валидации: почистить strip, проверить isdigit, преобразовать int — три строки, и ввод пользователя перестаёт быть лотереей. К концу курса эти три строки будут стоять в начале каждой функции, принимающей ввод.
Как проверить, что строка — это число: isdigit и его родственники
Методы проверки отвечают на вопросы о содержимом строки, не меняя её. isdigit() — «состоит ли строка только из цифр». isalpha() — «только из букв». isalnum() — «из букв и цифр». Все они возвращают строго True или False и влезают прямо в условие if, что делает код читаемым почти как обычную фразу.
user_input = '42'
if user_input.isdigit():
number = int(user_input)
print('Принято:', number * 2)
else:
print('Нужны только цифры')
bad_input = '42 года'
print(bad_input.isdigit())
Принято: 84 False
Здесь видна главная практическая ценность проверки: она стоит ДО преобразования. Без неё int('42 года') бросает ValueError, и программа падает на вводе пользователя — а должна вежливо сказать «нужны только цифры». Порядок «почистить, проверить, преобразовать» — это шаблон, который стоит применять к любому внешнему вводу.
isdigit, isnumeric, isdecimal: в чём разница
В Python три метода, которые выглядят одинаково, но проверяют разное. isdigit() — самый узкий по смыслу: цифры, которые понимает int(). isnumeric() — шире: он признаёт ещё и дробные символы вроде «½» и римские цифры. isdecimal() — между ними: принимает десятичные цифры любого алфавита, но не «½» и не надстрочные «²».
values = ['42', '½', '²']
for v in values:
print(v, v.isdigit(), v.isnumeric(), v.isdecimal())
42 True True True ½ False True False ² True True False
Вывод нагляднее таблицы: обычное «42» проходит все три проверки, «½» — только isnumeric, а надстрочная двойка «²» проходит isdigit и isnumeric, но не isdecimal. Разница видна и на восточноарабских цифрах «٤٢»: они десятичные, поэтому isdecimal их принимает. Для проверки ввода числа перед int() берите isdigit: он строже всех и не подпустит строку, которую int() потом не переварит. Впрочем, int('½') вообще выбросит ошибку — так что на практике isdigit работает как фильтр совместимости с int, а не как проверка «это число».
isalpha и isalnum: логины и артикулы
isalpha() отвечает «только буквы» — русские буквы тоже считаются, это не латин-only проверка. isalnum() — «буквы ИЛИ цифры» (alnum = alpha + numeric). Имя пользователя, артикул товара, номер паспорта — всё это проверяется одним вызовом вместо кучи условий.
login = 'АннаСмирнова'
print(login.isalpha())
article = 'A17B'
print(article.isalnum())
login_2026 = 'Анна2026'
print(login_2026.isalpha(), login_2026.isalnum())
True True False True
Здесь важная деталь про isalpha: проверка не ограничивает алфавит, но и не пропускает ничего лишнего — ни цифр, ни пробелов, ни дефисов. Логин anna-smirnova не пройдёт isalpha, хотя человек вводит вполне нормальное имя. Это не баг метода, а его граница: isalpha отвечает на вопрос про буквы, а не про допустимость логина. Для логинов с дефисом нужно отдельное правило.
| Метод | True, если строка | Пример |
|---|---|---|
| isdigit | Цифры, которые понимает int | '42' → True, '42 года' → False |
| isnumeric | Любые числовые символы | '½' → True, 'Ⅷ' → True |
| isdecimal | Десятичные цифры любого алфавита | '٤٢' → True, '²' → False |
| isalpha | Только буквы | 'Анна' → True, 'Анна1' → False |
| isalnum | Буквы или цифры | 'A17' → True, 'A-17' → False |
| isspace | Только «пустые» символы | ' ' → True |
| islower / isupper | Весь регистр нижний/верхний | 'мир' → True |
| isidentifier | Может быть именем переменной | 'имя' → True, '1x' → False |
Проверка безопасно: isspace и пустой ввод
isspace() отвечает, состоит ли строка целиком из «пустых» символов: пробелов, переводов строки, табуляций. Отдельный метод нужен редко, но он закрывает реальную дыру в валидации: строка из одних пробелов непуста, и len у неё не ноль — а человек считал, что ничего не ввёл.
empty = ''
spaces = ' '
print(bool(empty), bool(spaces))
if not spaces.strip():
print('Реально пусто (после strip)')
False True Реально пусто (после strip)
Разница между bool(spaces) и bool(spaces.strip()) — это разница между «в строке есть символы» и «в строке есть СОДЕРЖИМОЕ». Второе и нужно для проверки ввода. Ещё один приём: isidentifier() спрашивает, может ли строка быть именем переменной — полезно, когда проверяете имя, которое пользователь хочет использовать как ключ или тег.
Собираем валидатор: чистка, проверка, преобразование
Проверки редко живут сами по себе. В реальном коде это три шага, и порядок между ними имеет значение: сначала чистим, потом проверяем, потом преобразуем. Если проверить до чистки, пробелы по краям убьют правильный ввод.
def read_number(user_input):
clean = user_input.strip()
if not clean:
return None
if not clean.isdigit():
return None
return int(clean)
for raw in [' 42 ', '', '42 года', '0']:
print(repr(raw), '->', read_number(raw))
' 42 ' -> 42 '' -> None '42 года' -> None '0' -> 0
Обратите внимание на if not clean перед проверкой isdigit. Формально ''.isdigit() и так даёт False, так что проверка избыточна — но она объясняет намерение и защищает от другой беды: пустая строка после чистки означает, что человек ничего не ввёл, и это стоит отличить от «ввёл не число». Мой совет: если метод сам покрывает случай, всё равно оставьте явную проверку — читается код понятнее.
И последнее. Проверка isdigit спасает от ValueError на обычных данных, но не даёт полной защиты: строка «+7» или «-5» тоже не пройдёт isdigit, хотя это вполне осмысленные числа. Для таких форматов честнее try/except вокруг int(). Общее правило: проверка методом — для простых форматов, try/except — для всего остального.
Проверки почти всегда работают в паре с другими методами: strip() чистит вход перед проверкой, int() превращает результат в число, а split() разбирает строку на части — об этом подробно в уроке про split. Форматирование чисел обратно в текст разобрано в уроке про format().
Валидация ввода: собираем функцию целиком
Проверки редко живут сами по себе — они всегда часть функции, которая принимает ввод. Ниже такая функция целиком: чистит, проверяет и только потом преобразует. Порядок шагов зашит в тело функции, и это то, что делает её безопасной.
def read_int(user_input, default=None):
clean = user_input.strip()
if not clean:
return default
if not clean.isdigit():
return default
return int(clean)
print(read_int(' 42 '))
print(read_int(''))
print(read_int('42 года'))
42 None None
Функция возвращает default вместо исключения — и это осознанный выбор. Бросать ValueError внутри функции, которая просто читает поле формы, — значит заставлять вызывающий код ловить исключение на каждый чужой ввод. Возврат значения «не получилось» удобнее: вызывающий сам решит, что показать пользователю.
И последнее. Проверка — это не только «отсечь плохое», но и «поймать хорошее». isalnum() для артикула и isidentifier() для имени — это не «защита от злодеев», а способ убедиться, что данные в нужном формате, иначе дальше по коду будет мусор. Одно и то же условие работает в обе стороны.
Сначала предскажи ответ в голове — это главный навык программиста.
value = ' 7 '
clean = value.strip()
print(clean.isdigit())
print('abc123'.isalnum(), 'abc 123'.isalnum())
value = ' 42 '
print(value.strip().isdigit())
1. Что вернёт '42 года'.isdigit()?
2. Что вернёт ''.isdigit()?
3. Что вернёт 'Анна2026'.isalpha() и что isalnum()?
4. Как отсеять ввод из одних пробелов, который глазу кажется пустым?
5. Что вернёт 'Анна2026'.isupper()?
6. Что вернёт '½'.isdigit()?
7. Какой порядок действий правильный для внешнего ввода?
8. Что вернёт bool(' ')?
Проверьте три строки из формы: age = '29', name = 'Олег2', phone = ' +7 900 '. Напечатайте для age — прошёл ли проверку isdigit, для name — isalpha, для phone — что вернёт isspace до чистки и isdigit после phone.strip().replace(' ', '').
Чем isdigit отличается от isnumeric?
Оба про цифры, но isnumeric шире: принимает дробные символы вроде «½» и римские цифры. Для проверки обычных чисел перед int() берите isdigit — он строже и предсказуемее.
Как проверить, что строка — дробное число вроде '3.14'?
isdigit не подойдёт — точка не цифра. Приём: убрать одну точку replace('.', '', 1) и проверить isdigit, либо сразу попытаться float(value) в try/except — так делают в реальном коде.
Зачем проверки, если можно просто int(value) в try/except?
try/except — тоже рабочий путь. isdigit лучше читается в простых случаях и не прячет неожиданные ошибки: исключение от int(value) может быть и о чём-то другом. Для нетривиальных форматов (дробные, минус, пробелы) — try/except честнее.
Чем isdigit отличается от isnumeric и isdecimal?
isdigit — самый строгий: только цифры, которые понимает int(). isnumeric — шире, принимает дробные символы ('½') и римские цифры. isdecimal — между ними: десятичные цифры любого алфавита ('٤٢'), но не '½' и не надстрочная '²'. Для проверки пользовательского ввода перед int() берите isdigit — он не подпустит строку, которую int() потом не переварит.
Почему пустая строка не проходит isdigit?
Потому что все методы-проверки требуют наличия символов: ''.isdigit(), ''.isalpha() и все остальные дают False. Пустая строка не «состоит из цифр» — она вообще ни из чего не состоит. Если ввод может быть пустым, проверяйте это явно: if not clean: return None.
Как проверить, что строка не состоит только из пробелов?
Строкой из пробелов занимается не isspace, а обычная проверка после чистки: if not s.strip():. Разница между bool(s) и bool(s.strip()) — это разница между «есть символы» и «есть содержание». Метод isspace() тоже существует и отвечает, состоит ли строка целиком из пробелов, переводов строки и табуляций.
Понравился урок? Сошлитесь на него
«Классический сценарий — форма или чат-бот: пользователь должен ввести число, но вводит текст.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Строки · Урок 10
join: собрать строку из частей
split разбирает строку на части, join собирает обратно: разделитель, список строк — и одна готовая строка вместо десяти склеек плюсом. Разбираем синтаксис и главный вопрос: почему не плюс.
Строки · Урок 12
format() и старый процент: история форматирования
До f-строк текст собирали методом format, а до него — процентом. Эти способы живы в миллионах строк чужого кода: учимся читать их свободно и понимать, почему f-строки победили.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
Исключения · Урок 12
ValueError в Python: разбор строк в числа
int('восемнадцать') — тип подходящий, а значение не помещается. Разбираем сообщение invalid literal, границы int и float и честную проверку isdigit.
python int из строкиpython isdigit проверка
openpyxl · Урок 15
Выпадающие списки в Excel через openpyxl: DataValidation
DataValidation добавляет в ячейки выпадающий список: бариста выбирают напиток из меню, а не придумывают свои варианты — разбор ошибок ввода и списков с другого листа.
проверка данных excel pythonopenpyxl ошибка ввода
Строки · Урок 9
split: разобрать строку
Одна строка данных редко живёт одна: CSV-запись, строка лога, поля формы. Метод split режет строку по разделителю и возвращает список частей — разбираем все варианты, от запятой до splitlines.
python разбор csv строкиpython строка в список