Количество слов в тексте на Python: подробное объяснение
Подсчет количества слов в строке: основные методы
Наиболее эффективное решение: len(s.split())
Метод split() разбивает строку по любому пробельному символу (пробел, табуляция, перевод строки) и возвращает список слов (последовательностей непробельных символов). Функция len() возвращает количество элементов списка. Этот способ работает быстро и подходит для большинства задач, где слова разделены пробелами.
text = "Привет мир! Это Python 3.9"
count = len(text.split())
print(count) # 5Python strip (метод strip в python)
Типичные ошибки и их решения:
- Пустая строка:
"".split()возвращает пустой список,len()даёт 0 – корректно. - Строка из одних пробелов:
" ".split()также возвращает[], результат 0. - Знаки препинания, прикреплённые к слову (например, "мир!") считаются частью слова. Если требуется их игнорировать, используйте регулярные выражения (см. варианты ниже).
- Разделение по нескольким пробелам –
split()обрабатывает их автоматически.
Цель использования:
Быстрый подсчёт слов в строке, где слова разделены произвольными пробельными символами, и не требуется очистка от пунктуации.
Как подсчитать количество слов, игнорируя знаки препинания?
Используйте модуль re и шаблон \b\w+\b, который находит последовательности букв, цифр и символа подчёркивания (слова). Это отфильтровывает пунктуацию.
import re
text = "Привет, мир! Это Python 3.9."
words = re.findall(r'\b\w+\b', text)
print(len(words)) # 5Python повторить строку (повторение строки в python)
Проблемы:
- Для кириллицы шаблон
\wработает, но может не захватывать апострофы или дефисы внутри слов. В таких случаях нужно уточнять шаблон, например[а-яА-ЯёЁa-zA-Z]+. - Регулярные выражения медленнее простого
split(), но точнее для текстов с пунктуацией.
Когда использовать:
Для анализа естественного языка, обработки текстов с разными знаками препинания.
Как подсчитать количество слов без использования встроенных функций split и re?
Реализовать ручной подсчёт: пройти по строке и считать переходы от непробельного символа к пробельному.
def count_words_manual(text):
count = 0
in_word = False
for ch in text:
if ch.isspace():
in_word = False
else:
if not in_word:
count += 1
in_word = True
return count
text = " Пример строки с пробелами"
print(count_words_manual(text)) # 4Tuple в str python (преобразование кортежа в строку в python)
Ошибки:
- Неправильная обработка начальных/конечных пробелов – в примере учтено.
- Строка с одними пробелами даёт 0, что верно.
Цель:
Понимание алгоритма подсчёта, полезно для обучения и ситуаций, когда нужно изменить логику (например, считать только определённые символы).
Как подсчитать количество слов, разбивая только по пробелу (игнорируя табуляцию)?
Используйте split(' ') с одним пробелом, но он создаёт пустые строки при множественных пробелах. Надо отфильтровать их.
text = "слово1 слово2\tслово3"
parts = text.split(' ')
words = [w for w in parts if w]
print(len(words)) # 2 (табуляция не считается разделителем)Python объект в строку (преобразование объекта в строку в python)
Проблемы:
Разделителем являются только пробелы. Табуляция, новая строка остаются частью слов (если они не в начале/конце). Обычно это нежелательно.
Когда нужно:
Специфические форматы данных, где табуляция или другие пробельные символы не считаются разделителями.
Как подсчитать количество слов, состоящих только из букв (без цифр и подчёркиваний)?
Используйте re.findall с шаблоном [a-zA-Zа-яА-ЯёЁ]+.
import re
text = "Python 3.9 code_test"
words = re.findall(r'[a-zA-Zа-яА-ЯёЁ]+', text)
print(len(words)) # 2 ('Python', 'code' – 'test' отпало из-за подчёркивания, но оно есть? 'code_test' – подчёркивание не буква, разобьётся на 'code' и 'test'? Нет, + не допускает подчёркивание, поэтому 'code_test' не будет найден целиком.)
Ошибка:
Слова с дефисом (например, «как-то») не будут распознаны, если не включить дефис в шаблон.
Применение:
Анализ текстов, где цифры и символы не считаются частью слов.
Расширенные примеры подсчёта слов
Пример 1: Подсчёт слов в многострочном тексте из файла
with open('text.txt', 'r', encoding='utf-8') as f:
content = f.read()
word_count = len(content.split())
print(f'Количество слов: {word_count}')
Количество слов: 1247
Пример 2: Использование генератора для экономии памяти
def word_count_generator(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
yield len(line.split())
total = sum(word_count_generator('large_text.txt'))
print(f'Всего слов: {total}')
Всего слов: 84590
Пример 3: Подсчёт только уникальных слов с помощью Counter
from collections import Counter
import re
text = "кот собака кот птица собака кот"
words = re.findall(r'\w+', text)
counter = Counter(words)
print(f'Количество уникальных слов: {len(counter)}')
print(f'Самые частые: {counter.most_common(2)}')
Количество уникальных слов: 3
Самые частые: [('кот', 3), ('собака', 2)]
Пример 4: Подсчёт слов с использованием filter и лямбда-функции
text = "Пример строки с несколькими пробелами"
words = list(filter(None, text.split(' ')))
print(len(words)) # 4
4
Пример 5: Подсчёт слов, удовлетворяющих условию (длина > 3)
text = "Python Java C++ JavaScript Rust Go"
words = text.split()
long_words = [w for w in words if len(w) > 3]
print(f'Всего слов: {len(words)}, длинных (>3): {len(long_words)}')
Всего слов: 6, длинных (>3): 4
Пример 6: Использование map и sum для подсчёта слов в списке строк
lines = ["один два три", "четыре пять", "шесть"]
counts = list(map(lambda s: len(s.split()), lines))
total = sum(counts)
print(f'Всего слов: {total}')
Всего слов: 6
Пример 7: Подсчёт слов с определением границ вручную (для нестандартных разделителей)
def custom_word_count(text, delimiters=',;: '):
import re
pattern = '[' + re.escape(delimiters) + ']'
parts = re.split(pattern, text)
return len([p for p in parts if p])
text = "яблоко,груша;слива:персик апельсин"
print(custom_word_count(text)) # 5
5
Пример 8: Подсчёт слов с учётом регистра (считаем разные регистры как отдельные слова?)
import re
text = "Python python PYTHON"
words = re.findall(r'\w+', text)
print(f'Без приведения: {len(words)} уникальных? {len(set(words))}')
words_lower = [w.lower() for w in words]
print(f'С приведением: {len(set(words_lower))}')
Без приведения: 3 уникальных? 3 С приведением: 1