Справочник по Python · модуль 5 · строки
Глава 5.7
Проверки содержимого строк
Методы isalpha(), isascii(), isdecimal(), isdigit(), isnumeric() и isidentifier() отвечают на разные вопросы о символах строки. Выбирать нужно проверку под формат данных, а не ту, что просто вернула True.
- Категория
- Строковые методы
- Уровень
- Базовый → средний
- Связанные темы
- Unicode, ввод данных, идентификаторы
- Зачем это знать
- Проверять текст до преобразования и обработки
§1Общее правило семейства
Все методы вида is... устроены одинаково: они возвращают True, если условие выполняется для каждого символа строки, и не меняют её саму.
text = "Python3" print(text.isalpha()) print(text.isalnum()) print(text.isascii()) print(text)
False True True Python3
Первая проверка провалилась из-за одной цифры: достаточно единственного неподходящего символа, чтобы ответ стал ложным. Это отличает такие методы от поиска — они говорят о строке целиком, а не о наличии чего-то в ней.
§2Пустая строка
Отдельный вопрос — что отвечать, когда символов нет вовсе. Почти все методы семейства требуют хотя бы один символ и возвращают False.
empty = "" print(empty.isalpha()) print(empty.isdecimal()) print(empty.isascii())
False False True
isascii() выбивается из общего правила: он проверяет отсутствие символов вне ASCII, а в пустой строке таких символов нет — значит, условие выполнено. Помнить об этом стоит: проверка ввода через isascii() пропустит пустую строку.
§3isalpha(): только буквы
Метод требует, чтобы каждый символ был буквой — любого алфавита, а не только латинского.
print("Python".isalpha()) print("Привет".isalpha()) print("Python 3".isalpha()) print("".isalpha())
True True False False
Обратите внимание на третью строку: пробел — не буква. Поэтому проверить имя человека через isalpha() не выйдет, двойные имена и фамилии через дефис не пройдут.
§4isascii(): диапазон 0–127
Метод проверяет не тип символов, а их кодовые точки: все ли они меньше 128. Это ровно та таблица ASCII, о которой шла речь в главе 5.1.
print("Python 3!".isascii()) print("Питон".isascii())
True False
Первая строка содержит пробел и восклицательный знак — и всё равно проходит проверку. isascii() отвечает не на вопрос «это латинские буквы?», а на вопрос «поместится ли этот текст в один байт на символ?».
§5Три числовые проверки
Дальше идут три метода, которые кажутся одинаковыми, но образуют вложенные круги: каждый следующий шире предыдущего.
┌─ isnumeric() ─────────────────────────┐ │ ⅕ Ⅻ │ │ ┌─ isdigit() ───────────────────────┐ │ │ │ ² ³ │ │ │ │ ┌─ isdecimal() ────────────────┐ │ │ │ │ │ 0 1 2 3 4 5 6 7 8 9 ٣ │ │ │ │ │ └──────────────────────────────┘ │ │ │ └───────────────────────────────────┘ │ └────────────────────────────────────────┘
for sample in ["42", "²", "⅕"]: print(sample, sample.isdecimal(), sample.isdigit(), sample.isnumeric())
42 True True True ² False True True ⅕ False False True
Правило вложенности: если isdecimal() вернул True, два других тоже вернут True. Обратное неверно.
§6isdecimal()
Самая строгая проверка: символ должен быть обычной десятичной цифрой, из которой можно составить число.
print("2026".isdecimal()) print("-12".isdecimal()) print("3.14".isdecimal())
True False False
Это ключевое ограничение всего семейства: методы смотрят на символы, а не на синтаксис числа. Минус, точка, пробел, показатель степени — всё это отдельные символы, и цифрами они не являются.
§7isdigit()
Чуть шире: кроме обычных цифр принимает символы, которые в Unicode помечены как цифровые, — например, надстрочные индексы.
print("123".isdigit()) print("²".isdigit()) print("12 3".isdigit())
True True False
§8isnumeric()
Самая широкая проверка: сюда попадает всё, что Unicode считает числовым, включая дроби и числа других письменностей.
print("四".isnumeric()) print("⅕".isnumeric()) print("12.5".isnumeric())
True True False
Последняя строка показательна: isnumeric() — самая широкая из трёх проверок, но обычное дробное число она всё равно отвергает. Точка не входит ни в одну из них.
§9Сводная таблица
| Строка | isdecimal() | isdigit() | isnumeric() | int() сработает |
|---|---|---|---|---|
"42" | True | True | True | да |
"٣" (арабская цифра) | True | True | True | да, даёт 3 |
"²" | False | True | True | нет |
"⅕" | False | False | True | нет |
"Ⅻ" (римская) | False | False | True | нет |
"-12" | False | False | False | да |
"3.14" | False | False | False | нет, но float() — да |
Последний столбец добавлен не случайно: он показывает, что совпадения между проверкой и возможностью преобразования нет ни в одну сторону.
§10Проверка не равна преобразованию
Из таблицы следуют два неприятных вывода, и оба — источник настоящих ошибок.
Первый. isdecimal() вернул True, а число получилось не то, что ожидали.
value = "٣" print(value.isdecimal()) print(int(value))
True 3
Второй. Проверка вернула False, хотя строка — совершенно нормальное число.
value = "-12" print(value.isdecimal()) print(int(value))
False -12
isdecimal() — это не проверка «строку можно превратить в число». Она отвергает минусы, точки и пробелы и пропускает цифры чужих письменностей. Использовать её как условие перед int() — распространённая и незаметная ошибка.
§11Как проверять число на самом деле
Надёжный способ узнать, преобразуется ли строка в число, — попробовать её преобразовать. Полноценный разбор try и except будет в модуле 8, но выглядит это так.
value = "-12" try: number = int(value) print("число:", number) except ValueError: print("не число")
число: -12
Если же требование именно «только обычные цифры от нуля до девяти», проверки складывают: isascii() отсекает чужие письменности, isdecimal() — всё, кроме цифр.
for value in ["42", "٣", "-12", ""]: print(repr(value), value.isascii() and value.isdecimal())
'42' True '٣' False '-12' False '' False
§12isidentifier(): форма имени
Метод проверяет, годится ли строка на роль имени переменной по правилам Python: буквы, цифры и подчёркивание, причём цифра не может стоять первой.
for name in ["total_sum", "имя2", "2name", "user-name"]: print(name, name.isidentifier())
total_sum True имя2 True 2name False user-name False
Кириллица в именах допустима — Python это разрешает, хотя в реальном коде так не делают. И заметьте разницу с isalnum() из главы 5.6: там подчёркивание давало False, здесь — True.
§13Ключевые слова
У проверки есть слепое пятно: она проверяет только форму записи, но не занятость имени языком.
import keyword name = "class" print(name.isidentifier()) print(keyword.iskeyword(name)) print(name.isidentifier() and not keyword.iskeyword(name))
True True False
Модуль keyword — часть стандартной библиотеки; подключение модулей разбирается в главе 6.4. Без второй проверки программа, генерирующая имена, однажды создаст переменную class или return, и код перестанет работать.
§14Проверка под задачу
Общий подход: сначала сформулировать, какие символы допустимы, и только потом подбирать метод — иногда не один.
| Требование | Проверка |
|---|---|
| номер заказа из обычных цифр | value.isascii() and value.isdecimal() |
| любое целое число, возможно со знаком | попытка int(value) |
| дробное число | попытка float(value) |
| имя переменной | isidentifier() и не ключевое слово |
| текст без цифр и знаков | isalpha() |
| текст поместится в один байт на символ | isascii() |
§15Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
if value.isdecimal(): int(value) | отрицательные числа не пройдут проверку | пробовать int() и ловить ValueError |
считать isdecimal() гарантией обычных цифр | арабо-индийские цифры тоже проходят | добавить isascii() |
считать isnumeric() проверкой float | точка даёт False, а дробь ⅕ — True | пробовать float() |
"".isascii() как проверка ввода | вернётся True: пустая строка проходит | отдельно проверить длину |
"-12".isdigit() | False из-за минуса | методы смотрят на символы, не на синтаксис числа |
"class".isidentifier() | True: форма верна, но имя занято | добавить not keyword.iskeyword(name) |
"Иван Петров".isalpha() | False из-за пробела | проверять слова по отдельности |
считать isascii() проверкой латиницы | цифры, пробелы и знаки тоже проходят | сочетать с isalpha() |
§16Проверьте себя
Почему "Python3".isalpha() возвращает False?
Условие должно выполняться для каждого символа, а цифра 3 буквой не является.
Какая из трёх числовых проверок самая широкая?
isnumeric(). Внутри неё isdigit(), а внутри него — isdecimal().
Почему isdecimal() — плохая проверка перед int()?
Она отвергает "-12", которое прекрасно преобразуется, и пропускает цифры чужих письменностей.
Какой метод возвращает True для пустой строки?
isascii(): в пустой строке нет символов вне ASCII, значит условие выполнено.
Достаточно ли isidentifier() для выбора имени переменной?
Нет. Ключевые слова вроде class проходят проверку формы, их отсеивают через keyword.iskeyword().
Как проверить, что строка — обычное целое число из цифр?
value.isascii() and value.isdecimal(), а если допустим знак — попыткой int(value).
§17Шпаргалка
text.isalpha()text.isascii()text.isdecimal()text.isdigit()text.isnumeric()text.isascii() and text.isdecimal()text.isidentifier()keyword.iskeyword(name)Итог главы
Методы is... проверяют свойство каждого символа и требуют непустой строки — кроме isascii(), который пустую строку пропускает. Три числовые проверки образуют вложенные группы от isdecimal() к isnumeric(), но ни одна из них не отвечает на вопрос «это число»: минус и точка не проходят, а чужие цифры проходят. Для преобразования надёжнее попытка int() или float(), а описание формата стоит формулировать раньше, чем подбирать метод.