Текстовые программы на языке 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.