Текстовые программы на языке Python: от простого к сложному

Раздел: Практические задачи -> Текстовые программы

Текстовые программы на Python: практические решения

Python предоставляет широкие возможности для обработки текста. В этом разделе рассматриваются типовые задачи: подсчёт слов, поиск и замена, работа с файлами. Для каждой задачи предлагается основное эффективное решение и альтернативные варианты.

Как подсчитать количество вхождений каждого слова в тексте?

Основное решение с использованием collections.Counter и split()

from collections import Counter
text = "python это язык программирования python это просто"
words = text.split()
counter = Counter(words)
print(counter)

текстовые программы python (текстовые программы на python)

Counter({'python': 2, 'это': 2, 'язык': 1, 'программирования': 1, 'просто': 1})

Метод split() разбивает строку по пробельным символам, Counter подсчитывает количество каждого элемента. Это быстро и читаемо. Проблема: не учитываются знаки препинания.

Слова могут быть с точками или запятыми, например «программирования.». Можно предварительно очистить текст с помощью re.findall(r'\w+', text).

Как найти все уникальные слова и их количество?

Использование множества set() для уникальности и ручного подсчёта в цикле.

text = "яблоко банан яблоко апельсин банан"
words = text.split()
unique = set(words)
result = {word: words.count(word) for word in unique}
print(result)
{'апельсин': 1, 'банан': 2, 'яблоко': 2}

Метод list.count() для каждого слова повторно обходит список – неэффективно для больших текстов.

Производительность падает при увеличении объёма. Лучше использовать dict или Counter.

Как заменить одно слово на другое во всём тексте?

Строковый метод replace().

text = "Hello world, hello Python"
text = text.replace("hello", "hi")
print(text)
hi world, hi Python

Но замена чувствительна к регистру.

Чтобы игнорировать регистр, можно использовать регулярные выражения с флагом re.IGNORECASE.

Как прочитать текстовый файл и вывести количество строк и слов?

Чтение файла построчно.

with open('text.txt', 'r', encoding='utf-8') as f:
    lines = f.readlines()
    words = sum(len(line.split()) for line in lines)
print(f"Строк: {len(lines)}, слов: {words}")

Конструкция with open гарантирует закрытие файла.

Если файл большой, readlines() загружает всё в память. Для больших файлов лучше итерация по объекту файла.

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

Использование str.translate() или re.sub().

import re
text = "Привет, мир! Как дела?"
clean = re.sub(r'[^\w\s]', '', text)
print(clean)
Привет мир Как дела

Регулярное выражение [^\w\s] удаляет всё, кроме букв, цифр и пробелов.

В русском языке символ «ё» может не входить в \w в некоторых версиях Python. Лучше использовать re.sub(r'[\.,!?;:…]', '', text) с явным списком.

Расширенные примеры текстовых программ

Шифр Цезаря с поддержкой русского алфавита

Пример
def caesar_cipher(text, shift):
    alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    result = []
    for char in text.lower():
        if char in alphabet:
            index = (alphabet.index(char) + shift) % len(alphabet)
            result.append(alphabet[index])
        else:
            result.append(char)
    return ''.join(result)

enc = caesar_cipher('Привет, мир!', 3)
print(enc)
dec = caesar_cipher(enc, -3)
print(dec)
тулзкк, слз!
привет, мир!

Функция обрабатывает только буквы, остальные символы остаются без изменений. Для латиницы можно использовать собственный алфавит.

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

Генератор случайного текста на основе цепей Маркова

Пример
import random
def markov_chain(text, order=2):
    words = text.split()
    chain = {}
    for i in range(len(words) - order):
        key = tuple(words[i:i+order])
        next_word = words[i+order]
        if key not in chain:
            chain[key] = []
        chain[key].append(next_word)
    return chain

text = "я люблю python python люблю я python очень гибкий язык язык python популярен"
chain = markov_chain(text, 1)
current = ('я',)
result = list(current)
for _ in range(10):
    if current in chain:
        next_word = random.choice(chain[current])
        result.append(next_word)
        current = (next_word,)
    else:
        break
print(' '.join(result))
(пример случайный) я люблю python python люблю я python очень гибкий язык

Цепь Маркова позволяет генерировать текст, похожий на исходный. Порядок (order) определяет длину контекста.

При малом объёме обучающего текста часто возникают ситуации, когда current отсутствует в цепочке – генерация останавливается. Можно добавить fallback на случайный выбор.

Парсинг лог-файла с извлечением IP-адресов

Пример
import re
log = "192.168.0.1 - - [10/Oct/2023:13:55:36] "GET /index.html HTTP/1.1" 200 2326"
pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
ips = re.findall(pattern, log)
print(ips)
['192.168.0.1']

Регулярное выражение для простых IPv4.

Не проверяет валидность чисел (например, 999.999.999.999 тоже подходит). Для строгой проверки нужно расширить шаблон.

Текстовые программы на Python - comments

En
текстовые программы python (python)