Python str: как работать со строками эффективно

Раздел: Типы данных -> Встроенные типы данных

Обзор типа str

Строковый тип str в Python представляет неизменяемую последовательность символов Unicode. Каждый символ – это строка длины 1. Строки можно создавать, комбинировать, изменять (через создание новых) и анализировать. Далее рассмотрены основные приёмы работы.

Основной способ форматирования – f-строки

Как вставить значения переменных в строку наиболее читаемо и быстро?

F-строки (f-strings) появились в Python 3.6. Перед строкой ставится буква f, а внутри фигурных скобок указываются выражения.

name = "Анна"
age = 28
message = f"Привет, {name}! Тебе {age} лет."
print(message)

Type class python (класс type в python)

Привет, Анна! Тебе 28 лет.

Python string types (строковые типы в python)

Внутри скобок можно использовать любые выражения, включая вызовы методов и арифметику:

a = 5
b = 3
result = f"{a} + {b} = {a + b}"
print(result)

Python type str (тип str в python)

5 + 3 = 8

Python object type (тип объекта в python)

Частая ошибка: забыть букву f перед строкой – тогда фигурные скобки останутся как есть. Также нельзя смешивать f-строки с обычными кавычками внутри выражения, если они совпадают с внешними.

# Ошибка: внешние двойные кавычки, внутри тоже двойные
# print(f"Он сказал: "Привет"")  # SyntaxError
# Решение: использовать разные кавычки или экранирование
print(f"Он сказал: \"Привет\"")
print(f'Он сказал: "Привет"')

Python 3 types (типы данных в python 3)

Он сказал: "Привет"
Он сказал: "Привет"

Python float types (типы с плавающей запятой в python)

F-строки поддерживают форматирование чисел (выравнивание, знаки, точность).

pi = 3.14159265
print(f"Число пи: {pi:.2f}")

Python int types (целочисленные типы в python)

Число пи: 3.14

Как создать строку с кавычками внутри?

Используйте разные виды кавычек (одинарные, двойные, тройные) или экранирование обратным слешем.

# Одинарные кавычки внутри двойных
s1 = "Он сказал: 'Привет'"
# Двойные внутри одинарных
s2 = 'Она ответила: "Здравствуйте"'
# Тройные кавычки для многострочных
s3 = """Первая строка
Вторая строка с кавычками ' и " """
# Экранирование
s4 = "Кавычка \" внутри"
print(s1, s2, s3, s4, sep="\n")
Он сказал: 'Привет'
Она ответила: "Здравствуйте"
Первая строка
Вторая строка с кавычками ' и " 
Кавычка " внутри

Ошибка: если внутри строки встречается такой же символ кавычки, как и снаружи, без экранирования – SyntaxError.

Как объединить несколько строк в одну?

Самый простой способ – оператор +. Для объединения списка строк эффективнее использовать str.join().

# Конкатенация через +
first = "Python"
second = "3"
version = first + " " + second
print(version)

# join для списка
words = ["Hello", "world", "!"]
sentence = " ".join(words)
print(sentence)

# join с пустым разделителем
chars = ["a", "b", "c"]
print("".join(chars))
Python 3
Hello world !
abc

Типичная ошибка: попытка сложить строку с числом – вызовет TypeError. Нужно преобразовать число в строку через str().

# print("Возраст: " + 25)  # TypeError
print("Возраст: " + str(25))
# Или лучше через f-строку
print(f"Возраст: {25}")

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

Методы upper(), lower(), capitalize(), title(), swapcase() возвращают новую строку.

text = "python ЯЗЫК"
print(text.upper())
print(text.lower())
print(text.capitalize())
print(text.title())
print(text.swapcase())
PYTHON ЯЗЫК
python язык
Python язык
Python Язык
PYTHON язык

Как проверить, что строка состоит только из цифр?

print("12345".isdigit())
print("123a5".isdigit())
True
False

Аналогично isalpha(), isalnum(), isspace().

Проблема: для пустой строки все подобные методы возвращают False. Учитывайте это при валидации.

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

Метод find() возвращает индекс первого вхождения или -1. replace() заменяет все вхождения.

s = "Hello world, world!"
pos = s.find("world")
print(pos)  # 6
print(s.find("Python"))  # -1

# Замена
new_s = s.replace("world", "Python")
print(new_s)  # Hello Python, Python!

# Замена по количеству вхождений
print(s.replace("world", "Python", 1))  # Hello Python, world!
6
-1
Hello Python, Python!
Hello Python, world!

Ошибка: путаница find() и index()index() бросает ValueError, если подстрока не найдена.

Как разбить строку на части по разделителю и собрать обратно?

Метод split() разбивает строку на список подстрок. join() соединяет список в строку.

data = "apple,banana,orange"
parts = data.split(",")
print(parts)  # ['apple', 'banana', 'orange']

# Обратная сборка
new_str = "; ".join(parts)
print(new_str)  # apple; banana; orange

# split без аргумента – разделяет по пробельным символам
text = "  один   два   три  "
print(text.split())  # ['один', 'два', 'три']
print(text.split(" "))  # ['', '', 'один', '', '', 'два', '', '', 'три', '', '']
['apple', 'banana', 'orange']
apple; banana; orange
['один', 'два', 'три']
['', '', 'один', '', '', 'два', '', '', 'три', '', '']

Проблема: при split(" ") сохраняются пустые строки из-за двойных пробелов. Если это не нужно, используйте split() без аргументов.

Как удалить лишние пробелы в начале и конце строки?

Методы strip(), lstrip(), rstrip() удаляют пробельные символы (и другие, если передать аргумент).

s = "  Hello world! \n\t"
print(repr(s.strip()))
print(repr(s.lstrip()))
print(repr(s.rstrip()))
# Удаление конкретных символов
s2 = "...Python..."
print(s2.strip("."))
'Hello world!'
'Hello world! \n\t'
'  Hello world!'
Python

Как получить подстроку (срез) из строки?

Используйте синтаксис s[start:stop:step], где индексы начинаются с 0, отрицательные – с конца.

s = "Python"
print(s[0:3])   # Pyt
print(s[:3])    # Pyt
print(s[3:])    # hon
print(s[-3:])   # hon
print(s[::-1])  # nohtyP
print(s[::2])   # Pto
Pyt
Pyt
hon
hon
nohtyP
Pto

Ошибка: попытка изменить символ по индексу – s[0] = 'J' вызовет TypeError, так как строки неизменяемы. Создайте новую строку.

Как преобразовать число или другой объект в строку?

Функция str() создаёт строковое представление объекта.

num = 100
print(str(num))
print(str(3.14))
print(str([1, 2, 3]))
100
3.14
[1, 2, 3]

Для пользовательских классов можно определить метод __str__.

Как использовать сырую строку (raw string) для путей и регулярных выражений?

Поставьте перед строкой букву r или R. Обратные слеши не интерпретируются как escape-последовательности.

path = r"C:\Users\Name\Documents"
print(path)
# В регулярках: r"\d+\.\d+"
import re
regex = r"\b\w+\b"
text = "Hello world"
print(re.findall(regex, text))
C:\Users\Name\Documents
['Hello', 'world']

Проблема: сырая строка не может заканчиваться нечётным количеством обратных слешей (из-за невозможности экранировать закрывающую кавычку).

Как создать многострочную строку?

Используйте тройные кавычки (одинарные или двойные). Переносы строк и пробелы сохраняются.

poem = """Вот дом,
Который построил Джек.
А это пшеница,
Которая в тёмном чулане хранится."""
print(poem)
Вот дом,
Который построил Джек.
А это пшеница,
Которая в тёмном чулане хранится.

Чтобы избежать лишнего пробела в начале строки, можно использовать скобки и конкатенацию или textwrap.dedent.

Как проверить, начинается или заканчивается строка определённым текстом?

Методы startswith() и endswith() принимают строку или кортеж строк.

url = "https://example.com"
print(url.startswith("https"))
print(url.endswith(".com"))
print(url.endswith((".net", ".org", ".com")))
True
True
True

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

Метод count() возвращает количество непересекающихся вхождений.

s = "abracadabra"
print(s.count("abra"))  # 2
print(s.count("a"))     # 5
2
5

Как отформатировать строку старым способом (через %)?

Оператор % с кортежем или словарём – наследие C-стиля.

name = "Мир"
print("Привет, %s!" % name)
print("%d + %d = %d" % (2, 3, 5))
# Именованные
print("%(name)s, возраст %(age)d" % {"name": "Анна", "age": 30})
Привет, Мир!
2 + 3 = 5
Анна, возраст 30

Ошибки: несоответствие количества и типов аргументов, забытый % для кортежа с одним элементом.

Как отформатировать строку через метод format?

Метод str.format() использует фигурные скобки и поддерживает позиционные/именованные аргументы и спецификаторы.

name = "Елена"
age = 25
print("Имя: {0}, возраст: {1}".format(name, age))
print("Имя: {n}, возраст: {a}".format(n=name, a=age))
print("{:.2f}".format(3.14159))  # 3.14
print("{:#^20}".format(" Тест "))  # выравнивание
Имя: Елена, возраст: 25
Имя: Елена, возраст: 25
3.14
####### Тест ########

Проблема: если в строке есть фигурные скобки как литералы, их нужно удваивать – {{ и }}.

Как работать с Unicode и кодировками?

Строки хранятся в Unicode. Для преобразования в байты используйте encode(), обратно – decode().

text = "Привет, мир! ?"
bytes_utf8 = text.encode("utf-8")
print(bytes_utf8)
# Обратно
decoded = bytes_utf8.decode("utf-8")
print(decoded)
# Проблема с кодировкой
# text.encode("ascii")  # UnicodeEncodeError
# Решение: игнорировать или заменять
safe = text.encode("ascii", errors="ignore")
print(safe.decode())
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82, \xd0\xbc\xd0\xb8\xd1\x80! \xf0\x9f\x8c\x8d'
Привет, мир! ?
Привет, мир! 

Этот раздел охватывает основные возможности типа str. Дополнительные продвинутые примеры приведены ниже.

Расширенные примеры работы со строками

Форматирование с выравниванием и заполнителем

F-строки и метод format позволяют задавать ширину поля, выравнивание (<, >, ^) и символ-заполнитель.

Пример
number = 42
print(f"|{number:<10}|")   # выравнивание влево
print(f"|{number:>10}|")   # вправо
print(f"|{number:^10}|")   # по центру
print(f"|{number:*>10}|")  # заполнитель '*'
print(f"|{number:0=10}|")  # для чисел – заполнение нулями после знака
|42        |
|        42|
|    42    |
|********42|
|0000000042|

Использование str.maketrans и translate для массовой замены

str.maketrans() создаёт таблицу перевода, а translate() применяет её. Эффективно для замены отдельных символов.

Пример
intab = "aeiou"
outtab = "12345"
trans_table = str.maketrans(intab, outtab)
text = "hello world"
print(text.translate(trans_table))  # h2ll4 w4rld

# Удаление символов: третий аргумент – символы, которые нужно удалить
trans_del = str.maketrans("", "", "lo")
print(text.translate(trans_del))  # he wrd
h2ll4 w4rld
he wrd

Шаблоны string.Template

Модуль string.Template предоставляет упрощённую замену с использованием $. Полезно, когда строка приходит из ненадёжного источника (безопаснее, чем eval).

Пример
from string import Template
t = Template("Здравствуйте, $name! Ваш баланс: $amount руб.")
print(t.substitute(name="Иван", amount=1500))
# substitute требует все ключи, safe_substitute пропускает отсутствующие
print(t.safe_substitute(name="Петр"))  # $amount останется как есть
Здравствуйте, Иван! Ваш баланс: 1500 руб.
Здравствуйте, Петр! Ваш баланс: $amount руб.

Регулярные выражения (re) для поиска и замены

Модуль re позволяет искать по шаблону, выполнять сложные замены и разбивать строки.

Пример
import re

text = "Контакты: email@example.com, support@test.org"
# Найти все email
emails = re.findall(r"[\w.]+@[\w.]+", text)
print(emails)

# Заменить все цифры на #
new = re.sub(r"\d", "#", "12 апреля 2025")
print(new)

# Разделить по знакам препинания и пробелам
parts = re.split(r"[\s,;]+", "яблоко, груша; апельсин   банан")
print(parts)
['email@example.com', 'support@test.org']
## апреля ####
['яблоко', 'груша', 'апельсин', 'банан']

Интернирование строк (sys.intern)

Интернирование ускоряет сравнение строк, сохраняя в памяти только одну копию. Полезно для множества повторяющихся строк.

Пример
import sys

a = sys.intern("пример_длинной_строки_для_сравнения")
b = sys.intern("пример_длинной_строки_для_сравнения")
# Теперь сравнение идёт по ссылке, а не посимвольно
print(a is b)  # True (без intern было бы False)
True

Сравнение строк с учётом локали (locale.strcoll)

Для сортировки с учётом правил языка (например, буква ё в русском) используйте locale.strcoll.

Пример
import locale
locale.setlocale(locale.LC_ALL, "ru_RU.UTF-8")  # настройка локали

words = ["ёлка", "елка", "ель", "ельник"]
# Обычная сортировка (по коду Unicode)
print(sorted(words))  # ['елка', 'ель', 'ельник', 'ёлка']
# Сортировка с учётом локали
print(sorted(words, key=locale.strxfrm))  # ['елка', 'ель', 'ельник', 'ёлка'] (может отличаться в зависимости от локали)
['елка', 'ель', 'ельник', 'ёлка']
['елка', 'ель', 'ельник', 'ёлка']

Работа с большими строками через io.StringIO

При конкатенации большого числа строк лучше использовать io.StringIO для эффективности.

Пример
import io

parts = ["строка " + str(i) for i in range(1000)]
buf = io.StringIO()
for part in parts:
    buf.write(part)
result = buf.getvalue()
print(len(result))  # длина результирующей строки
13889

Нормализация Unicode (unicodedata)

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

Пример
import unicodedata

# Строки выглядят одинаково, но кодированы по-разному
s1 = "é"  # один символ U+00E9
s2 = "e\u0301"  # e + комбинирующий accent U+0301
print(s1 == s2)  # False

n1 = unicodedata.normalize("NFC", s1)
n2 = unicodedata.normalize("NFC", s2)
print(n1 == n2)  # True
False
True

Эти примеры показывают, как обрабатывать строки в нестандартных ситуациях и оптимизировать производительность.

Тип str в Python - comments

En
Python type str (python)