Методы строк в Python: замена и проверка содержимого

Обновлено:

В этой части разберём:

replace()
removeprefix()
removesuffix()

isascii()
isalpha()
islower()
isupper()
istitle()
isalnum()
isspace()

isdecimal()
isdigit()
isnumeric()

replace()

1. Замена подстроки

Метод:

replace()

находит одну подстроку и заменяет её другой.

text = 'Python is good. Python is popular.'

result = text.replace('Python', 'Django')

print(result)

Результат:

Django is good. Django is popular.

Метод работает не только с отдельными словами. Можно заменять любой фрагмент строки.

Например:

phone = '+995-555-12-34-56'

result = phone.replace('-', ' ')

print(result)

Результат:

+995 555 12 34 56

2. Ограничение количества замен

Третьим аргументом можно указать максимальное количество замен:

text = 'Python Python Python Python'

result = text.replace(
    'Python',
    'Django',
    2,
)

print(result)

Результат:

Django Django Python Python

Были заменены только первые два вхождения.

Без третьего аргумента заменяются все найденные вхождения.


3. replace() можно использовать для удаления

Чтобы удалить найденную подстроку, заменяем её пустой строкой:

text = '8 000 GEL'

result = text.replace(' ', '')

print(result)

Результат:

8000GEL

Другой пример:

phone = '+995-555-123-456'

result = phone.replace('-', '')

print(result)

Результат:

+995555123456

По сути:

replace(old, '')

означает:

Найти old и ничего не поставить вместо него.


Замены не пересекаются

4. Как replace() продолжает поиск

Рассмотрим строку:

text = '79797'

Попробуем заменить:

result = text.replace('797', '77')

print(result)

Результат:

7797

В исходной строке можно визуально увидеть два варианта:

79797
^^^
  ^^^

Но эти вхождения пересекаются.

replace() находит первое вхождение:

797

обрабатывает его, а затем продолжает поиск после уже найденного фрагмента.

Поэтому пересекающиеся вхождения повторно не используются.

Это похоже на поведение изученного ранее:

count()

removeprefix()

5. Удаление префикса

Метод:

removeprefix()

появился в Python 3.9.

Он удаляет указанную подстроку только с начала строки.

url = 'https://example.com'

result = url.removeprefix('https://')

print(result)

Результат:

example.com

Проверяется именно начало строки.


6. Если префикса в начале нет

url = 'example.com/https://page'

result = url.removeprefix('https://')

print(result)

Результат:

example.com/https://page

Фрагмент:

https://

есть внутри строки, но не в её начале.

Поэтому строковое значение остаётся без изменений.


replace() и removeprefix()

7. Это разные задачи

text = 'test-python-test'

Если написать:

print(text.replace('test', '', 1))

получим:

-python-test

Здесь мы сказали:

Найди первое вхождение test и замени его.

А:

print(text.removeprefix('test'))

означает:

Удали test, только если строка действительно начинается с него.

Именно поэтому для работы с префиксами намерение лучше выражает:

removeprefix()

Как мог бы работать removeprefix()

8. Учебная реализация

Используя уже изученные срезы, можно написать похожую функцию самостоятельно:

def my_removeprefix(text, prefix):
    prefix_length = len(prefix)

    if text[:prefix_length] == prefix:
        return text[prefix_length:]

    return text

Проверим:

print(
    my_removeprefix(
        'https://example.com',
        'https://',
    )
)

Результат:

example.com

Сначала мы узнаём длину префикса:

prefix_length = len(prefix)

Затем берём начало строки такой же длины:

text[:prefix_length]

Если оно совпало с prefix, возвращаем строку без этой части:

text[prefix_length:]

По такому же принципу работает идея встроенного removeprefix().


removesuffix()

9. Удаление окончания строки

Метод:

removesuffix()

тоже появился в Python 3.9.

Он проверяет конец строки.

Например:

filename = 'report.txt'

result = filename.removesuffix('.txt')

print(result)

Результат:

report

Если указанного суффикса в конце нет:

filename = 'report.txt'

print(filename.removesuffix('.csv'))

получим:

report.txt

10. Префикс и суффикс

https://example.com.json
^^^^^^^             ^^^^^
prefix              suffix

Для начала:

text.removeprefix('https://')

Для конца:

text.removesuffix('.json')

Оба метода удаляют только полное совпадение в соответствующей позиции.


Методы is...

11. Методы-проверки

В Python часто встречаются названия, начинающиеся на:

is

Например, у строк:

isascii()
isalpha()
islower()
isupper()
istitle()
isalnum()
isspace()
isdigit()
isdecimal()
isnumeric()

Такие методы выполняют проверку и возвращают:

True

или:

False

isascii()

12. Проверка на ASCII

Метод:

isascii()

возвращает True, если строка пустая или все её символы относятся к ASCII.

ASCII занимает диапазон:

U+0000–U+007F

то есть первые 128 кодовых позиций Unicode.

Например:

text = 'Python 2026!'

print(text.isascii())

Результат:

True

Здесь:

  • латинские буквы;
  • пробел;
  • цифры;
  • !

входят в ASCII.


13. Символ вне ASCII

text = 'Price: 100€'

print(text.isascii())

Результат:

False

Символ:

€

не входит в диапазон ASCII.

Кириллица тоже находится за его пределами:

print('Python'.isascii())
print('Питон'.isascii())

Результат:

True
False

14. Пустая строка

print(''.isascii())

Результат:

True

В пустой строке нет ни одного символа, который находился бы за пределами ASCII.


isalpha()

15. Только буквы

Метод:

isalpha()

возвращает True, если строка содержит хотя бы один символ и все её символы являются буквенными символами Unicode.

print('Python'.isalpha())
print('Питон'.isalpha())

Результат:

True
True

Метод не ограничен английским алфавитом.

Например:

print('Ελλάδα'.isalpha())

тоже вернёт True.


16. Другие символы нарушают проверку

print('Python3'.isalpha())
print('Python developer'.isalpha())
print('Python_developer'.isalpha())
print('Python!'.isalpha())

Результат:

False
False
False
False

Достаточно одного символа, который не является буквой.

Пустая строка:

print(''.isalpha())

также возвращает:

False

islower()

17. Проверка нижнего регистра

Метод:

islower()

возвращает True, если:

  • в строке есть хотя бы один символ, имеющий регистр;
  • все такие символы находятся в нижнем регистре.

Например:

print('python'.islower())
print('python 2026!'.islower())

Результат:

True
True

Цифры, пробелы и ! не мешают проверке.


18. Верхняя буква

print('python Developer 2026'.islower())

Результат:

False

Есть:

D

в верхнем регистре.

Если в строке вообще нет регистровых символов:

print('12345!'.islower())

получим:

False

То же самое относится к пустой строке.


isupper()

19. Проверка верхнего регистра

Работает аналогично:

print('PYTHON'.isupper())
print('PYTHON 2026!'.isupper())
print('PYTHON Developer'.isupper())
print('12345'.isupper())

Результат:

True
True
False
False

Метод требует хотя бы один регистровый символ, и все такие символы должны находиться в верхнем регистре.


istitle()

20. Проверка title case

Метод:

istitle()

проверяет, соответствует ли строка правилам регистра title.

print('Python Developer'.istitle())

Результат:

True

А:

print('Python developer'.istitle())

Результат:

False

21. Границы внутри строки тоже имеют значение

Мы уже видели особенности метода:

title()

Поэтому:

print('Python-Developer'.istitle())

вернёт:

True

А:

print('Python-developer'.istitle())

вернёт:

False

istitle() проверяет правила title case для регистровых последовательностей строки. Пустая строка возвращает False.


isalnum()

22. Буквенно-числовые символы

Название можно воспринимать как:

alpha + numeric

Метод:

isalnum()

возвращает True, если в строке есть хотя бы один символ и каждый символ относится к буквенным или числовым символам Unicode.

print('Python2026'.isalnum())
print('Python'.isalnum())
print('2026'.isalnum())

Результат:

True
True
True

Необязательно одновременно иметь и буквы, и цифры.


23. Пробелы и специальные символы

print('Python 2026'.isalnum())
print('Python_2026'.isalnum())
print('Python-2026'.isalnum())
print('Python!'.isalnum())

Результат:

False
False
False
False

Пустая строка тоже возвращает:

False

isspace()

24. Только пробельные символы

Метод:

isspace()

возвращает True, если строка непустая и все её символы являются пробельными.

print('   '.isspace())

Результат:

True

Проверяются не только обычные пробелы.

Например:

text = ' \t\n'

print(text.isspace())

Результат:

True

Здесь находятся:

обычный пробел
\t → табуляция
\n → перенос строки

25. Любой непробельный символ

print('   A   '.isspace())

Результат:

False

Пустая строка:

print(''.isspace())

тоже возвращает:

False

Три проверки числовых символов

Теперь разберём три похожих метода:

isdecimal()
isdigit()
isnumeric()

Их удобно представить по степени расширения:

isdecimal()
    ↓
isdigit()
    ↓
isnumeric()

isdecimal() — наиболее строгий.

isdigit() принимает больше вариантов.

isnumeric() — наиболее широкий из этих трёх.


isdecimal()

26. Десятичные цифры Unicode

Метод:

isdecimal()

возвращает True, если строка непустая и состоит только из символов Unicode категории:

Nd — Decimal Number

То есть из десятичных цифр, которые используются для записи чисел в системах с цифрами 0–9.

Обычный пример:

print('123456'.isdecimal())

Результат:

True

27. Это не только ASCII-цифры

Например, арабско-индийские цифры:

print('٠١٢٣٤٥٦٧٨٩'.isdecimal())

Результат:

True

Также десятичными Unicode-цифрами являются, например:

१२३     — Devanagari
๑๒๓     — Thai
᠑᠒᠓     — Mongolian
123   — Fullwidth

Проверим:

print('१२३'.isdecimal())
print('๑๒๓'.isdecimal())
print('᠑᠒᠓'.isdecimal())
print('123'.isdecimal())

Все эти проверки возвращают:

True

isdecimal() ориентируется не на внешний вид ASCII-цифр, а на свойства символов Unicode.


isdigit()

28. Более широкая проверка

isdigit() включает все символы, подходящие для isdecimal(), а также некоторые дополнительные символы Unicode с числовым типом:

Digit

или:

Decimal

Например:

print('123'.isdigit())

Результат:

True

И:

print('²'.isdigit())
print('³'.isdigit())

Результат:

True
True

Надстрочные:

²
³

считаются цифрами для isdigit(), но не являются десятичными цифрами категории Nd.


29. Сравнение с isdecimal()

number = '²'

print(number.isdecimal())
print(number.isdigit())
print(number.isnumeric())

Результат:

False
True
True

Это один из самых наглядных примеров различий методов.


isnumeric()

30. Самая широкая числовая проверка

isnumeric() принимает:

  • десятичные цифры;
  • дополнительные digit-символы;
  • другие символы Unicode, имеющие числовое значение.

Формально сюда входят символы с Unicode-свойствами:

Numeric_Type=Decimal
Numeric_Type=Digit
Numeric_Type=Numeric

31. Обычные цифры

print('123'.isnumeric())

Результат:

True

32. Дробные числовые символы

Например:

print('½'.isnumeric())
print('⅕'.isnumeric())

Результат:

True
True

Но:

print('½'.isdigit())
print('½'.isdecimal())

Результат:

False
False

33. Римские числовые символы

Unicode содержит отдельные символы римских чисел:

Ⅰ
Ⅴ
Ⅻ

Например:

print('Ⅻ'.isnumeric())

Результат:

True

А:

print('Ⅻ'.isdigit())
print('Ⅻ'.isdecimal())

вернёт:

False
False

34. Другие Unicode-числа

Например:

print('四'.isnumeric())

Результат:

True

Символ:

四

имеет числовое значение 4 в Unicode.

Но:

print('四'.isdigit())
print('四'.isdecimal())

вернёт:

False
False

Сравнение трёх методов

35. Наглядная таблица

Строка isdecimal() isdigit() isnumeric()
'123' True True True
'123' True True True
'१२३' True True True
'²' False True True
'½' False False True
'Ⅻ' False False True
'四' False False True

Поэтому можно представить множества так:

isdecimal ⊂ isdigit ⊂ isnumeric

Что не подходит ни одному из трёх

36. Знак минуса

number = '-123'

print(number.isdecimal())
print(number.isdigit())
print(number.isnumeric())

Результат:

False
False
False

Причина проста:

-

сам по себе не является числовым символом.

Методы проверяют символы строки, а не пытаются полностью разобрать строку как числовой литерал Python.


37. Вещественное число

number = '12.5'

Все три метода возвращают:

False

Потому что:

.

не является числовым символом.


38. Экспоненциальная запись

number = '1e10'

Получим:

False

для всех трёх методов, потому что:

e

не является числовым символом.


39. Комплексное число

number = '5j'

Также:

False

из-за символа:

j

40. Шестнадцатеричная запись

number = '0xff'

Все три метода:

False

Префикс и буквенные цифры:

x
f

не проходят эти проверки.


41. Двоичная запись

number = '0b1010'

тоже даст:

False

из-за:

b

Какой из трёх методов использовать

42. Проверка десятичных цифр

Если задача звучит так:

Проверить, что строка непустая и состоит только из десятичных Unicode-цифр,

очень точно подходит:

isdecimal()

Например:

user_age = '25'

if user_age.isdecimal():
    print('Строка состоит из десятичных цифр')

Это более строгая проверка, чем:

isdigit()

и:

isnumeric()

43. Когда нужен isdigit()

Если программе допустимы в том числе digit-символы вроде:

²
³

можно использовать:

isdigit()

44. Когда нужен isnumeric()

Если необходимо распознавать более широкий набор Unicode-символов с числовым значением:

½
Ⅻ
四

подходит:

isnumeric()

Проверка простой вещественной записи

45. replace() + isdecimal()

Поскольку точка мешает:

'12.5'.isdecimal()

можно для простой проверки удалить одну точку:

number = '12.5'

result = (
    number
    .replace('.', '', 1)
    .isdecimal()
)

print(result)

Результат:

True

46. Почему ограничиваем замену

Для:

number = '12.5.7'

мы удаляем только одну точку:

number.replace('.', '', 1)

Получаем:

125.7

И:

'125.7'.isdecimal()

вернёт:

False

Поэтому несколько десятичных точек такая проверка не пропустит.


Проверка числа с минусом

47. Последовательная нормализация строки

Позже мы познакомимся с методом:

strip()

Он позволяет убрать пробельные символы по краям строки.

Тогда простой алгоритм можно построить так:

number = '  -12.5  '

normalized_number = (
    number
    .strip()
    .removeprefix('-')
    .replace('.', '', 1)
)

result = normalized_number.isdecimal()

print(result)

Результат:

True

Что произошло:

'  -12.5  '
↓ strip()
'-12.5'
↓ removeprefix('-')
'12.5'
↓ replace('.', '', 1)
'125'
↓ isdecimal()
True

Такая проверка позволяет обработать простые варианты:

'25'
'-25'
'25.5'
'-25.5'

48. Проверка строкового формата и преобразование числа — разные задачи

Методы:

isdecimal()
isdigit()
isnumeric()

проверяют свойства символов строки.

Они не являются универсальными проверками:

Можно ли это значение преобразовать в любой числовой тип Python?

Например:

'1e10'.isdecimal()

возвращает:

False

хотя такая строка может представлять корректное вещественное число при соответствующем преобразовании.

По мере усложнения допустимых форматов ручная проверка тоже усложняется. Позже мы познакомимся с обработкой исключений через try / except, которая позволяет решать некоторые задачи проверки числового ввода другим способом.


Главное по теме

replace() заменяет найденные непересекающиеся вхождения:

text.replace(old, new)

и позволяет ограничить количество замен:

text.replace(old, new, count)

Чтобы удалить фрагмент:

text.replace(old, '')

removeprefix() удаляет указанную строку только с начала:

text.removeprefix(prefix)

removesuffix() — только с конца:

text.removesuffix(suffix)

Оба метода появились в Python 3.9.

Методы is... выполняют проверки и возвращают True или False.

isascii()   → только ASCII
isalpha()   → буквенные символы
islower()   → все регистровые символы в нижнем регистре
isupper()   → все регистровые символы в верхнем регистре
istitle()   → строка соответствует title case
isalnum()   → буквенные и числовые символы
isspace()   → только пробельные символы

Три числовых метода отличаются широтой проверки:

isdecimal()
    ↓
isdigit()
    ↓
isnumeric()

Пример:

'123' → все три True
'²'   → isdigit и isnumeric
'½'   → только isnumeric
'Ⅻ'   → только isnumeric
'四'   → только isnumeric

Для проверки именно строки из десятичных цифр подходит:

isdecimal()

А для более широких наборов числовых Unicode-символов используются:

isdigit()
isnumeric()