Подсчёт количества подстрок в строке на Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подсчета количества вхождений подстроки в исходную строку используйте функцию str.count(sub):

Python
Скопировать код
txt = "привет мир, привет вселенная"
sub = "привет"
print(txt.count(sub))  # Вывод: 2. Весело! Сегодня вселенная особенно радушна!

Указанный метод возвращает число неперекрывающихся вхождений слова "привет" в строке txt.

Кинга Идем в IT: пошаговый план для смены профессии

Отражаемся от накладывающихся подстрок

Для подсчета накладывающихся подстрок использование метода str.count() не подойдет. Здесь пригодятся регулярные выражения и просмотр вперед:

Python
Скопировать код
import re

txt = "приветпривет"
sub = "(?=привет)"
# Вперед! Все Валдо собрались в одном месте и зовут нас на поиск!
print(len(re.findall(sub, txt)))  # Вывод: 2

Данный шаблон находит все позиции, на которых начинается "привет", даже если это часть следующего "привет".

Старая школа: считаем вручную

Если вам не по душе встроенные методы, можно отказаться от автоматизации и воспользоваться ручным подсчетом:

Python
Скопировать код
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() ищет подстроку, начиная с последней зафиксированной позиции и при каждом нахождении увеличивает счетчик.

Визуализация: Строка как поездное путешествие

Представьте вашу строку в виде поезда, а подстроку — в виде пассажиров:

Markdown
Скопировать код
Поезд (🚂): [🚃🔤, 🚃🔤🔤, 🚃🔤, 🚃🔤🔤🔤]
Пассажир (🔤): "🔤"

Каждый вагон вмещает определенное количество пассажиров. Мы хотим подсчитать общее число пассажиров в поезде:

Python
Скопировать код
"🚃🔤 + 🚃🔤🔤 + 🚃🔤 + 🚃🔤🔤🔤".count("🔤")

Процесс подсчета выглядит так:

Markdown
Скопировать код
Всего 🔤: **6**

Метод .count() надежно вычисляет общее количество пассажиров в вагонах.

Обратите внимание: регистрозависимость и нормализация

Обратите внимание, что str.count() чувствителен к регистру. Чтобы считать без учета регистра, преобразуйте обе строки либо в нижний, либо в верхний регистр:

Python
Скопировать код
txt.lower().count(sub.lower())  # Согласованность важна, особенно в регистре символов!

Также следует нормализовать вашу строку для правильного учета особенностей представления Unicode.

Колебания и опасения по поводу производительности

Несмотря на очевидную элегантность, методы ручного подсчета и регулярные выражения могут значительно уступать по эффективности методу str.count() при работе с длинными строками, где производительность играет решающую роль.

Остерегайтесь крайних случаев

Будьте начеку при обработке крайних случаев, в частности, когда речь идет о пустых строках или подстроках. Они могут создать неожиданные проблемы и дать неожиданные результаты:

Python
Скопировать код
txt = "привет"
sub = ""
print(txt.count(sub))  # К удивлению, получаем 6, ведь в программировании даже пустота имеет вес!

Полезные материалы

  1. Встроенные типы — документация Python 3.12.2официальное руководство по использованию метода str.count() в Python.
  2. Метод строки count() в Pythonбазовое руководство применения count() от W3Schools.
  3. re — Операции с регулярными выражениями — документация Python 3.12.2 — подробная информация о продвинутых техниках работы с модулем регулярных выражений в Python.
  4. Регулярные выражения в Python (Часть 1) – Real Python — обстоятельное руководство по регулярным выражениям от Real Python.
  5. Метод строки count() в Python – GeeksforGeeks — подробное описание с пошаговым руководством и примерами использования count() от GeeksforGeeks.