← Назад к курсу

Подробный урок Python по работе со строками

Задача: разобрать, как пользоваться строками в Python – отдельно методы строкового объекта и отдельно функции из сторонних модулей.


1️⃣ Общий план урока

Шаг Что будем делать Примеры / материалы
1️⃣ Вводные сведения о типах и их происхождении str, bytes, Unicode
2️⃣ Методы у самого типа str – “что можно делать через .” список с коротким описанием + демо‑код
3️⃣ Функции из различных модулей – “что нужно импортировать” str (модуль), re, string, textwrap, unicodedata, pathlib, os.path
4️⃣ Практический блок: реальные сценарии (NLP, обработка файлов) примеры с регулярными выражениями, токенизация, кодирование
5️⃣ Упражнения + cheat‑sheet небольшие задачи + таблица‑шпаргалка

2️⃣ Что такое «строка» в Python

  • str – неизменяемый (immutable) объект, хранит Unicode‑символы.
  • При работе с bytes (байтами) или другими кодировками – их нужно декодировать (decode()) или кодировать (encode()).
  • Пример:
s = "Привет, мир!"
print(type(s))          # <class 'str'>
print(len(s))           # 13 (включая пробелы)

Трюк: если нужен «изменяемый» набор символов – используйте список (list(s)) или io.StringIO.


3️⃣ Методы строки (str‑object)

3.1 Основные (часто используемые)

Метод Что делает Пример
capitalize() Делает первый символ заглавным, остальные строчными "hello".capitalize() → "Hello"
casefold() «Сильный» регистронезависимый "ß".casefold() → "ss"
center(width, fillchar=' ') Выравнивает по центру "ab".center(5) → " ab "
count(sub, start=0, end=-1) Возвращает количество вхождений "ababa".count("a") → 3
encode(encoding='utf-8', errors='strict') Преобразует в bytes "тест".encode('utf-8') → b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82'
endswith(suffix, start=0, end=-1) Проверка суффикса "file.txt".endswith(".txt") → True
find(sub, start=0, end=-1) / index(sub, …) Позиция первого вхождения (или -1/ValueError) "abc".find("b") → 1
format(*args, **kwargs) Форматирование строки (f‑строки тоже используют) "{0} {1}".format("a","b") → "a b"
isalnum(), isalpha(), isdigit(), islower(), isupper() Булевы проверки "123".isdigit() → True
join(iterable) Соединяет элементы через текущую строку "-".join(["a","b"]) → "a-b"
ljust(width, fillchar=' ') / rjust(width, fillchar=' ') Выравнивание слева/справа "ab".rjust(5) → " ab"
lower() / upper() Приводит к нижнему/верхнему регистру "HELLO".lower() → "hello"
replace(old, new, count=-1) Заменяет подстроку "abc".replace("b","x") → "axc"
split(sep=None, maxsplit=-1) / rsplit Разбивает по разделителю "a,b,c".split(",") → ['a','b','c']
strip(chars=None), lstrip(), rstrip() Убирает пробелы/указанные символы слева/справа/с обеих сторон " hello ".strip() → "hello"
title() Каждое слово с заглавной буквы "hello world".title() → "Hello World"
translate(table) Преобразует символы по таблице см. ниже

3.2 Методы, связанные с Unicode

Метод Описание
encode(encoding='utf-8', errors='strict') Возвращает bytes.
decode(encoding='utf-8', errors='strict') Для bytes.
casefold() Наиболее «полное» приведение к нижнему регистру (для сравнения).
isascii() True, если строка содержит только ASCII‑символы.
str.upper()/lower()/title() Работают с Unicode‑переносами и кейсами.

3.3 Методы, полезные в NLP и обработке текста

Метод Применение Пример
strip() Удаление пробелов из начала/конца (часто встречается в корпусах).  
split() / rsplit() Разбивка предложений, слов, токенов.  
replace() Упрощённые подстановки (например, удалить HTML‑теги).  
translate() Создание словаря для транслитерации (пример ниже).  
join() Конкатенация токенов в список.  
format() / f‑строки Удобный шаблон для построения больших текстов (логов, JSON).  

4️⃣ Функции из сторонних модулей

Методы – это «встроенные» в тип str. Функции – импортируются из модулей и часто позволяют дополнительно обрабатывать строки (регулярки, утилиты, кодировки и т.д.).

4.1 str (модуль) – функции‑утилиты

Функция Что делает Пример
ascii(object) Возвращает строку с ASCII‑эквивалентами (escape‑символы для не‑ASCII). ascii("ü") → "'\\u00fc'"
format(format_spec, **kwargs) Тоже самое, что метод format, но принимает любой объект. format("{:.2f}", 3.1415) → "3.14"
format_map(mapping) Применяет форматирование через словарь. "{name}".format_map({"name":"Bob"}) → "Bob"
len(object) Длина строки/байт. len("abc") → 3
str.__new__(cls, *args, **kwargs) Технически «для создания» – обычно не используем.  

4.2 Модуль re – регулярные выражения

Функция Применение Пример
re.match(pattern, string) Проверка совпадения в начале строки. re.match(r"^\d+", "123abc") → объект
re.search(pattern, string) Поиск первого совпадения в любой позиции. re.search(r"\d+", "abc123def") → объект
re.findall(pattern, string) Все неперекрывающиеся совпадения. re.findall(r"\w+", "a b-c") → ['a','b','c']
re.sub(pattern, repl, string, count=0) Замена. re.sub(r"\d", "#", "123abc") → "###abc"
re.split(pattern, string, maxsplit=0) Разбивка по паттерну. re.split(r"[,.]", "a,b.c") → ['a','b','c']
re.compile(pattern) Позволяет компилировать паттерн один раз и использовать многократно (экономит время). p = re.compile(r"\d{4}"); p.findall("1999-2020")

NLP‑пример: re часто используется для токенизации (удаление пунктуации, выделение чисел).

4.3 Модуль string – константы и полезные таблицы

Функция/константа Описание
string.ascii_letters Все буквы латиницы (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ).
string.ascii_lowercase Маленькие буквы.
string.ascii_uppercase Большие буквы.
string.digits 0‑9.
string.punctuation Пунктуационные символы.
string.whitespace Пробелы, табуляции, переводы строк.

Пример: генерация случайной строки:

import string, random
''.join(random.choice(string.ascii_letters + string.digits) for _ in range(8))
# → 'aB3k9Lm2'

4.4 Модуль textwrap – форматирование текста (печать, вывод)

Функция Что делает Пример
wrap(text, width=70, **kwargs) Разбивает строку на строки указанной ширины. textwrap.wrap("A very long sentence.", width=10) → ['A very', 'long sen', 'tence.']
fill(text, width=70) Возвращает '\n'‑разбитый текст (упрощённый).  
indent(text, prefix=' ', predicate=None) Добавляет отступ к каждой строке.  
dedent(text) Убирает общие отступы (полезно для вывода кода).  

4.5 Модуль unicodedata – работа с Unicode‑свойствами

Функция Применение
unicodedata.normalize(form, unistr) Приведение строки к NFC/NFD/NFKC/NFKD.
unicodedata.category(ch) Возвращает категорию (например, "Lu" – буква, "Nd" – цифра).
unicodedata.name(ch) Получить официальное название символа.
unicodedata.lookup(name) Получить символ по имени ( "LATIN SMALL LETTER A" → "a" ).

Типичный сценарий: нормализация входных данных перед сравнением (unicodedata.normalize('NFKC', s)).

4.6 pathlib – объектно‑ориентированный путь к файлам (модуль os.path тоже подходит)

Функция Что делает Пример
Path(str).suffix Расширение файла.  
Path(str).stem Имя файла без расширения.  
Path(str).parent Директорию.  
Path(str).name Имя + расширение.  
Path(str).read_text(encoding='utf-8') Читает файл в строку.  
Path(str).write_text(text, encoding='utf-8') Записывает строку в файл.  

4.7 Модуль codecs – специфические кодировки (base64, rot13 и др.)

Функция Пример
codecs.encode(string, encoding='rot13') "Hello".encode('rot13') → 'Uryyb'
codecs.decode(bytes_obj, encoding='utf-8') Преобразует байты обратно в str.

4.8 Модуль csv – чтение/запись CSV‑строк

Функция Описание
csv.reader(file_obj) Итератор строк CSV (словари/списки).
csv.DictReader(file_obj) Итерирует словари.
csv.writer(file_obj) Записывает строки в CSV.

Пример: csv.DictReader(open("users.csv")) → генерация списка строк без лишних пробелов.

4.9 Модуль email (для обработки email‑строк)

Функция Пример
email.message.Message Парсинг заголовков и тела письма.
email.utils.parseaddr(addr) Разбирает строку "Иван <ivan@example.com>" → ("Иван","ivan@example.com").
email.header.Header Кодирует/декодирует строки заголовков (MIME‑base64).

4.10 Модуль itertools – функции для «построения» строк из итераторов

Функция Описание
itertools.chain.from_iterable(iters) Собирает строки из множества частей.
itertools.islice Возвращает часть строки (индексирование).
itertools.groupby Группирует строки по ключу (полезно для агрегации).

5️⃣ Практический блок – небольшие задачки (с «чистом» решением)

Задача 1️⃣ – Нормализация данных

import unicodedata

def normalize(txt):
    return unicodedata.normalize('NFKC', txt)

s = "Jürgen Müller".encode('utf-8')   # bytes
print(normalize(s.decode()))          # → "Jürgen Müller"

Задача 2️⃣ – Токенизация и удаление пунктуации

import re

def tokenize(text):
    # Убираем всё кроме букв и цифр
    tokens = re.findall(r"[A-Za-z0-9]+", text)
    # Приводим к нижнему регистру
    return [t.lower() for t in tokens]

txt = "Hello, world! 123 – это тест."
print(tokenize(txt))
# ['Hello', 'world', '123', 'это', 'тест']

Задача 3️⃣ – Формирование «красивого» вывода текста

import textwrap

def pretty_print(very_long):
    wrapped = textwrap.fill(very_long, width=30, replace_whitespace=False)
    print(wrapped)

pretty_print("A very long sentence that should be broken into lines for readability.")

Задача 4️⃣ – Сохранение лог‑сообщения в файл

from pathlib import Path

log_path = Path("logs") / "app.log"
log_path.parent.mkdir(exist_ok=True)

log_path.write_text(f"{Path(__file__).name} – {' '.join(map(str, __dict__))}", encoding="utf-8")

Задача 5️⃣ – Сравнение методов и функций

Операция Метод строки Функция модуля
Удалить пробелы с обоих концов s.strip() s.strip() (тоже метод) – но s = s.strip() (не функция)
Проверка, является ли строка полностью цифрой s.isdigit() re.fullmatch(r"\d+", s)
Конвертация в нижний регистр s.lower() s.lower() (тоже метод) – unicodedata.normalize('NFKD', s).lower() (функция)
Подсчёт слов len(s.split()) textwrap.wrap(s, width=1) → список строк → sum(len(w) for w in ...), но обычно метод проще.

6️⃣ Cheat‑sheet (шпаргалка)

6.1 Методы str

Метод Краткое назначение
s.lower()/upper()/casefold() Приводит к регистру
s.strip()/lstrip()/rstrip() Убирает пробельные символы
s.split(sep=None) Разбивает по разделителю
s.join(iterable) Объединяет элементы
s.replace(old, new, count) Заменяет подстроку
s.find()/index() Поиск позиции
s.startswith()/endswith() Проверка начала/конца
s.format(**kwargs) / f‑строки Форматирование
s.translate(table) Подстановка символов
s.encode()/decode() Работа с bytes
s.casefold() Регистронезависимое сравнение
s.isalnum()/isalpha()/isdigit()/isascii() Булевы проверки
s.title()/capitalize() Приводит к «первому слову»/каждому слову
s.zfill(width) Добавляет нули слева (для чисел)
s.isdigit() Проверка, что строка – цифры

6.2 Функции из модулей

Модуль Функция Что делает
re re.search, re.findall, re.sub, re.split, re.compile Регулярные выражения
string ascii_letters, digits, punctuation Константы набора символов
textwrap wrap, fill, indent, dedent Форматирование текста
unicodedata normalize, category, name, lookup Unicode‑нормализация и свойства
pathlib Path, read_text, write_text, suffix Работа с файлами как строками
codecs encode, decode (разные кодировки) Кодировка/декодировка
csv reader, DictReader, writer CSV‑парсинг
email parseaddr, Header Парсинг/кодирование email‑строк
itertools chain.from_iterable, groupby Функции для объединения/группировки строк

7️⃣ Заключение

  • Методы – быстрый, «внутри» объекта. Чаще всего используются для простых манипуляций (изменение регистра, поиск, замена).
  • Функции из модулей – позволяют «выходить» за рамки простых операций: работать с регулярками, форматировать текст, нормализовать Unicode, парсить CSV/email‑строки, использовать наборы символов и т.д.
  • Сочетание обеих подходов – эффективный «питонский» способ обработки любого текстового данных: от чистого кода до анализа больших корпусов (NLP).

Напоминание: для серьёзных задач (например, предобработка корпусов, веб‑парсинг) рекомендуется комбинировать str‑методы + re + unicodedata. Это даёт гибкость и одновременно минимизирует «грязные» преобразования.