Подсчёт количества подстрок в строке на Python
Быстрый ответ
Для подсчета количества вхождений подстроки в исходную строку используйте функцию str.count(sub)
:
txt = "привет мир, привет вселенная"
sub = "привет"
print(txt.count(sub)) # Вывод: 2. Весело! Сегодня вселенная особенно радушна!
Указанный метод возвращает число неперекрывающихся вхождений слова "привет" в строке txt.
Отражаемся от накладывающихся подстрок
Для подсчета накладывающихся подстрок использование метода str.count()
не подойдет. Здесь пригодятся регулярные выражения и просмотр вперед:
import re
txt = "приветпривет"
sub = "(?=привет)"
# Вперед! Все Валдо собрались в одном месте и зовут нас на поиск!
print(len(re.findall(sub, txt))) # Вывод: 2
Данный шаблон находит все позиции, на которых начинается "привет", даже если это часть следующего "привет".
Старая школа: считаем вручную
Если вам не по душе встроенные методы, можно отказаться от автоматизации и воспользоваться ручным подсчетом:
def count_substrings(string, substring):
count = start = 0
while start >= 0:
start = string.find(substring, start) + 1
if start > 0:
count += 1
return count
txt = "приветпривет"
sub = "привет"
print(count_substrings(txt, sub)) # Вывод: 2; или, вернее, количество совпадений: 2.
Здесь функция find()
ищет подстроку, начиная с последней зафиксированной позиции и при каждом нахождении увеличивает счетчик.
Визуализация: Строка как поездное путешествие
Представьте вашу строку в виде поезда, а подстроку — в виде пассажиров:
Поезд (🚂): [🚃🔤, 🚃🔤🔤, 🚃🔤, 🚃🔤🔤🔤]
Пассажир (🔤): "🔤"
Каждый вагон вмещает определенное количество пассажиров. Мы хотим подсчитать общее число пассажиров в поезде:
"🚃🔤 + 🚃🔤🔤 + 🚃🔤 + 🚃🔤🔤🔤".count("🔤")
Процесс подсчета выглядит так:
Всего 🔤: **6**
Метод .count()
надежно вычисляет общее количество пассажиров в вагонах.
Обратите внимание: регистрозависимость и нормализация
Обратите внимание, что str.count()
чувствителен к регистру. Чтобы считать без учета регистра, преобразуйте обе строки либо в нижний, либо в верхний регистр:
txt.lower().count(sub.lower()) # Согласованность важна, особенно в регистре символов!
Также следует нормализовать вашу строку для правильного учета особенностей представления Unicode.
Колебания и опасения по поводу производительности
Несмотря на очевидную элегантность, методы ручного подсчета и регулярные выражения могут значительно уступать по эффективности методу str.count()
при работе с длинными строками, где производительность играет решающую роль.
Остерегайтесь крайних случаев
Будьте начеку при обработке крайних случаев, в частности, когда речь идет о пустых строках или подстроках. Они могут создать неожиданные проблемы и дать неожиданные результаты:
txt = "привет"
sub = ""
print(txt.count(sub)) # К удивлению, получаем 6, ведь в программировании даже пустота имеет вес!
Полезные материалы
- Встроенные типы — документация Python 3.12.2 — официальное руководство по использованию метода
str.count()
в Python. - Метод строки count() в Python — базовое руководство применения
count()
от W3Schools. - re — Операции с регулярными выражениями — документация Python 3.12.2 — подробная информация о продвинутых техниках работы с модулем регулярных выражений в Python.
- Регулярные выражения в Python (Часть 1) – Real Python — обстоятельное руководство по регулярным выражениям от Real Python.
- Метод строки count() в Python – GeeksforGeeks — подробное описание с пошаговым руководством и примерами использования
count()
от GeeksforGeeks.