Поиск и форматирование строк
Уроки курсаПоиск и форматирование строк
Подсчёт вхождений и проверка границ строки: count(), startswith(), endswith()
Три метода в этом разделе делают разные вещи и возвращают разные типы: count() даёт число (int), а startswith() и endswith() — булево значение (bool). Разберём каждый по очереди.
count() — сколько раз встречается подстрока
count(sub) считает, сколько раз подстрока sub встречается в строке. Вхождения не перекрываются — это важно понять на примере:
print('абракадабра'.count('а')) # 5
print('aaa'.count('aa')) # 1
print('hello world'.count('o')) # 2
print('python'.count('x')) # 0
Почему 'aaa'.count('aa') равно 1, а не 2? Метод находит первое вхождение 'aa' на позиции 0, «съедает» эти два символа, и следующий поиск начинается с позиции 2, где остался только один 'a'. Второго вхождения уже нет. Это стандартное поведение: count() не ищет перекрывающиеся совпадения.
Если подстрока не найдена — возвращает 0, а не -1. Это отличает его от find().
startswith() и endswith() — проверка начала и конца
Оба метода возвращают True или False. startswith(prefix) проверяет, начинается ли строка с указанного префикса, endswith(suffix) — заканчивается ли заданным суффиксом.
filename = 'report_2024.csv'
print(filename.startswith('report')) # True
print(filename.startswith('data')) # False
print(filename.endswith('.csv')) # True
print(filename.endswith('.xlsx')) # False
Эти методы удобнее, чем срезы, потому что код сразу говорит, что именно проверяется. Сравните:
# Через срез — неочевидно
if filename[:6] == 'report':
...
# Через startswith — читается как условие
if filename.startswith('report'):
...
Типичное применение endswith() — проверка расширения файла или формата строки перед обработкой:
def process_file(name):
if not name.endswith('.csv'):
print('Ожидается CSV-файл')
return
print(f'Обрабатываем файл: {name}')
process_file('data.csv') # Обрабатываем файл: data.csv
process_file('data.xlsx') # Ожидается CSV-файл
Оба метода чувствительны к регистру: 'Python'.startswith('py') вернёт False, потому что 'P' и 'p' — разные символы. Если нужна проверка без учёта регистра, строку надо предварительно привести к нижнему регистру через lower().
