← Назад к курсу
20 задач на работу со строками в Python с решениями и комментариями
1. Подсчет гласных букв в строке
def count_vowels(text):
"""
Подсчитывает количество гласных букв в строке
"""
vowels = "aeiouаеёиоуыэюя" # Английские и русские гласные
count = 0
# Приводим текст к нижнему регистру для унификации
text_lower = text.lower()
# Проверяем каждый символ
for char in text_lower:
if char in vowels:
count += 1
return count
# Пример использования
text = "Hello, World! Привет, мир!"
print(f"Гласных букв: {count_vowels(text)}")
2. Проверка на палиндром
def is_palindrome(text):
"""
Проверяет, является ли строка палиндромом
"""
# Удаляем пробелы и приводим к нижнему регистру
cleaned_text = ''.join(char.lower() for char in text if char.isalnum())
# Сравниваем строку с её обратным представлением
return cleaned_text == cleaned_text[::-1]
# Пример использования
print(is_palindrome("А роза упала на лапу Азора")) # True
print(is_palindrome("Hello")) # False
3. Подсчет слов в строке
def count_words(text):
"""
Подсчитывает количество слов в строке
"""
# Разделяем строку по пробелам
words = text.split()
# Удаляем пустые строки (если есть множественные пробелы)
words = [word for word in words if word.strip()]
return len(words)
# Пример использования
text = "Python — высокоуровневый язык программирования"
print(f"Количество слов: {count_words(text)}")
4. Инвертирование строки
def reverse_string(text):
"""
Возвращает строку в обратном порядке
"""
# Способ 1: Используем срез
return text[::-1]
def reverse_string_manual(text):
"""
Инвертирование строки вручную (для понимания алгоритма)
"""
reversed_text = ""
# Проходим по строке с конца
for i in range(len(text) - 1, -1, -1):
reversed_text += text[i]
return reversed_text
# Пример использования
text = "Python"
print(f"Инвертированная строка: {reverse_string(text)}")
print(f"Инвертированная строка (вручную): {reverse_string_manual(text)}")
5. Поиск самого длинного слова
def find_longest_word(text):
"""
Находит самое длинное слово в строке
"""
# Удаляем знаки препинания и разбиваем на слова
import string
translator = str.maketrans('', '', string.punctuation)
cleaned_text = text.translate(translator)
words = cleaned_text.split()
# Находим слово с максимальной длиной
if not words:
return ""
return max(words, key=len)
# Пример использования
text = "Я изучаю программирование на Python"
print(f"Самое длинное слово: {find_longest_word(text)}")
6. Подсчет повторений символов
def count_characters(text):
"""
Подсчитывает частоту каждого символа в строке
"""
char_count = {}
for char in text:
# Игнорируем пробелы (можно настроить)
if char != ' ':
char_count[char] = char_count.get(char, 0) + 1
return char_count
# Пример использования
text = "программирование"
result = count_characters(text)
for char, count in sorted(result.items()):
print(f"'{char}': {count}")
7. Удаление дубликатов символов
def remove_duplicates(text):
"""
Удаляет повторяющиеся символы из строки
"""
seen = set()
result = []
for char in text:
if char not in seen:
seen.add(char)
result.append(char)
return ''.join(result)
# Пример использования
text = "программирование"
print(f"Без дубликатов: {remove_duplicates(text)}")
8. Проверка на анаграмму
def is_anagram(str1, str2):
"""
Проверяет, являются ли строки анаграммами
"""
# Удаляем пробелы и приводим к нижнему регистру
str1_clean = ''.join(str1.lower().split())
str2_clean = ''.join(str2.lower().split())
# Сравниваем отсортированные символы
return sorted(str1_clean) == sorted(str2_clean)
# Пример использования
print(is_anagram("listen", "silent")) # True
print(is_anagram("python", "typhon")) # True
9. Шифр Цезаря
def caesar_cipher(text, shift):
"""
Шифрует текст шифром Цезаря
"""
result = ""
for char in text:
if char.isalpha(): # Если символ - буква
# Определяем базовый код в зависимости от регистра
base = ord('A') if char.isupper() else ord('a')
# Сдвигаем символ
shifted_char = chr((ord(char) - base + shift) % 26 + base)
result += shifted_char
else:
result += char
return result
# Пример использования
text = "Hello, World!"
shift = 3
encrypted = caesar_cipher(text, shift)
print(f"Зашифровано: {encrypted}")
decrypted = caesar_cipher(encrypted, -shift)
print(f"Расшифровано: {decrypted}")
10. Форматирование телефонного номера
def format_phone_number(number):
"""
Форматирует телефонный номер в стандартный вид
"""
# Удаляем все нецифровые символы
digits = ''.join(filter(str.isdigit, str(number)))
# Проверяем длину номера
if len(digits) == 11 and digits[0] == '8':
digits = '7' + digits[1:]
# Форматируем номер
if len(digits) == 10:
return f"+7 ({digits[:3]}) {digits[3:6]}-{digits[6:8]}-{digits[8:]}"
elif len(digits) == 11:
return f"+{digits[0]} ({digits[1:4]}) {digits[4:7]}-{digits[7:9]}-{digits[9:]}"
else:
return "Неверный формат номера"
# Пример использования
print(format_phone_number("89161234567"))
print(format_phone_number("+7 (916) 123-45-67"))
11. Поиск email-адресов в тексте
import re
def find_emails(text):
"""
Находит все email-адреса в тексте
"""
# Регулярное выражение для поиска email
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
# Ищем все совпадения
emails = re.findall(pattern, text)
return emails
# Пример использования
text = """
Контакты: info@company.com, support@site.ru,
sales-department@company.org, not_an_email@
"""
emails = find_emails(text)
print("Найденные email:")
for email in emails:
print(f" - {email}")
12. Удаление HTML-тегов
import re
def remove_html_tags(text):
"""
Удаляет HTML-теги из строки
"""
# Регулярное выражение для поиска HTML-тегов
clean = re.compile('<.*?>')
# Удаляем теги
cleaned_text = re.sub(clean, '', text)
return cleaned_text
# Пример использования
html = "<h1>Заголовок</h1><p>Это <b>текст</b> с тегами.</p>"
print(f"Без тегов: {remove_html_tags(html)}")
13. Кодирование строки в Base64
import base64
def encode_base64(text):
"""
Кодирует строку в Base64
"""
# Преобразуем строку в байты
text_bytes = text.encode('utf-8')
# Кодируем в Base64
encoded_bytes = base64.b64encode(text_bytes)
# Возвращаем как строку
return encoded_bytes.decode('utf-8')
def decode_base64(encoded_text):
"""
Декодирует строку из Base64
"""
# Декодируем
decoded_bytes = base64.b64decode(encoded_text)
# Возвращаем как строку
return decoded_bytes.decode('utf-8')
# Пример использования
text = "Секретное сообщение"
encoded = encode_base64(text)
print(f"Закодировано: {encoded}")
decoded = decode_base64(encoded)
print(f"Раскодировано: {decoded}")
14. Подсчет смайликов в тексте
def count_smileys(text):
"""
Подсчитывает количество смайликов в тексте
"""
# Определяем паттерны смайликов
smiley_patterns = [
':)', ':(', ':D', ':P', ';)', ':O',
':-)', ':-D', ':-P', ';-)',
'🙂', '😀', '😂', '😊', '😎'
]
count = 0
for pattern in smiley_patterns:
count += text.count(pattern)
return count
# Пример использования
text = "Привет! :) Как дела? 😊 Сегодня отличный день! :-D"
print(f"Найдено смайликов: {count_smileys(text)}")
15. Проверка корректности скобок
def check_brackets(text):
"""
Проверяет корректность расстановки скобок
"""
stack = []
bracket_pairs = {')': '(', ']': '[', '}': '{'}
for char in text:
if char in '([{': # Открывающая скобка
stack.append(char)
elif char in ')]}': # Закрывающая скобка
if not stack: # Если стек пуст
return False
if stack.pop() != bracket_pairs[char]:
return False
# Если после обработки стек пуст - все скобки закрыты
return len(stack) == 0
# Пример использования
expressions = [
"(a + b) * (c - d)", # True
"[(a + b) * c]", # True
"((a + b) * c", # False
")a + b(", # False
]
for expr in expressions:
print(f"{expr}: {check_brackets(expr)}")
16. Удаление лишних пробелов
def normalize_spaces(text):
"""
Удаляет лишние пробелы из строки
"""
# Заменяем множественные пробелы на один
import re
normalized = re.sub(r'\s+', ' ', text)
# Удаляем пробелы в начале и конце
normalized = normalized.strip()
return normalized
# Пример использования
text = " Python — язык программирования "
print(f"Нормализовано: '{normalize_spaces(text)}'")
17. Транслитерация
def transliterate(text):
"""
Транслитерирует русский текст в латиницу
"""
translit_dict = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'yo', 'ж': 'zh', 'з': 'z', 'и': 'i',
'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',
'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't',
'у': 'u', 'ф': 'f', 'х': 'kh', 'ц': 'ts', 'ч': 'ch',
'ш': 'sh', 'щ': 'shch', 'ъ': '', 'ы': 'y', 'ь': '',
'э': 'e', 'ю': 'yu', 'я': 'ya'
}
result = []
for char in text.lower():
if char in translit_dict:
result.append(translit_dict[char])
else:
result.append(char)
return ''.join(result)
# Пример использования
text = "Привет, мир!"
print(f"Транслитерация: {transliterate(text)}")
18. Поиск подстроки (алгоритм КМП)
def kmp_search(text, pattern):
"""
Поиск подстроки с использованием алгоритма Кнута-Морриса-Пратта
"""
# Функция для создания префикс-функции
def compute_prefix(pattern):
prefix = [0] * len(pattern)
j = 0
for i in range(1, len(pattern)):
while j > 0 and pattern[i] != pattern[j]:
j = prefix[j - 1]
if pattern[i] == pattern[j]:
j += 1
prefix[i] = j
return prefix
if not pattern:
return []
# Вычисляем префикс-функцию
prefix = compute_prefix(pattern)
result = []
j = 0
for i in range(len(text)):
while j > 0 and text[i] != pattern[j]:
j = prefix[j - 1]
if text[i] == pattern[j]:
j += 1
if j == len(pattern):
result.append(i - j + 1)
j = prefix[j - 1]
return result
# Пример использования
text = "ababcabcabababd"
pattern = "ababd"
print(f"Найденные позиции: {kmp_search(text, pattern)}")
19. Генератор случайных строк
import random
import string
def generate_random_string(length=10, include_digits=True, include_special=False):
"""
Генерирует случайную строку заданной длины
"""
# Определяем набор символов
characters = string.ascii_letters # Буквы
if include_digits:
characters += string.digits # Цифры
if include_special:
characters += string.punctuation # Спецсимволы
# Генерируем случайную строку
return ''.join(random.choice(characters) for _ in range(length))
# Пример использования
print(f"Случайная строка: {generate_random_string(12)}")
print(f"С паролем: {generate_random_string(8, True, True)}")
20. Анализатор текста
def text_analyzer(text):
"""
Анализирует текст и выводит статистику
"""
# Удаляем лишние пробелы
text = ' '.join(text.split())
# Основная статистика
stats = {
'total_chars': len(text),
'chars_without_spaces': len(text.replace(' ', '')),
'word_count': len(text.split()),
'sentence_count': text.count('.') + text.count('!') + text.count('?'),
'avg_word_length': 0
}
# Вычисляем среднюю длину слова
words = text.split()
if words:
stats['avg_word_length'] = sum(len(word) for word in words) / len(words)
return stats
# Пример использования
text = "Python — это мощный язык программирования. Он прост в изучении!"
analysis = text_analyzer(text)
for key, value in analysis.items():
print(f"{key}: {value}")
Методика решения строковых задач
Общие подходы:
- Анализ задачи: Определить, что требуется сделать
- Выбор метода: Выбрать подходящие строковые методы или алгоритмы
- Обработка граничных случаев: Учесть пустые строки, регистр, пробелы
- Тестирование: Проверить на различных входных данных
Полезные методы Python для работы со строками:
- str.split() - разбиение строки
- str.join() - объединение списка в строку
- str.find(), str.index() - поиск подстроки
- str.replace() - замена подстрок
- str.lower(), str.upper() - изменение регистра
- str.strip() - удаление пробелов
- str.startswith(), str.endswith() - проверка начала/конца
Оптимизация:
- Используйте генераторы списков для преобразований
- Применяйте join() вместо конкатенации в циклах
- Используйте регулярные выражения для сложных поисков
- Кэшируйте результаты при многократных вычислениях
Эти задачи покрывают основные аспекты работы со строками и помогут закрепить навыки программирования на Python.