Гид по технологиям

Манипуляции со строками в Python — полное руководство

5 min read Python Обновлено 29 Dec 2025
Манипуляции со строками в Python — руководство
Манипуляции со строками в Python — руководство

TL;DR

Python предоставляет богатый набор инструментов для работы со строками: создание, индексирование, срезы, объединение, форматирование (f-строки), методы split/join и функции ord/chr/len. Строки в Python неизменяемы: операции возвращают новые строки. Знайте про кодовые точки Unicode и ошибки IndexError/TypeError — они помогают отлавливать некорректный доступ.

Что такое строка

Строка — это последовательность символов (кодовых точек Unicode). Она неизменяема: любые изменения создают новую строку.

Иллюстрация работы со строками в Python

Основные варианты создания строк в Python

Создать строку просто: присвойте литерал переменной. Можно использовать одинарные, двойные или тройные кавычки.

str1 = 'Hello!'
str2 = "Hello!"
str3 = """Hello!"""
str4 = '''Hello!'''
print(str1)
print(str2)
print(str3)
print(str4)

Вывод:

Hello!
Hello!
Hello!
Hello!

Преимущество двойных кавычек — внутри них можно писать одинарную кавычку без экранирования:

s = "Using 'single quote' inside double quotes"
print(s)

Вывод:

Using 'single quote' inside double quotes

Для многострочных литералов используйте тройные кавычки — переносы сохраняются без \n:

s1 = """This is a multiline
string using three double quotes"""
s2 = "This is a multiline\nstring using double quotes"

print(s1)
print(s2)

Вывод:

This is a multiline
string using three double quotes
This is a multiline
string using double quotes

Доступ к символам: индексирование и срезы

Иллюстрация срезов и индексации строк в Python

Если нужен один символ — используйте индекс (indexing). Если диапазон — используйте срез (slicing).

Индексирование

Индексы строк в Python начинаются с 0. Допускается отрицательная нумерация: -1 — последний символ, -2 — предпоследний.

s = "MAKEUSEOF"
# Полная строка
print(s)

# 1-й символ
print(s[0])

# 2-й символ
print(s[1])

# Последний символ
print(s[-1])

# 2-й с конца
print(s[-2])

Вывод:

MAKEUSEOF
M
A
F
O

При обращении по индексу используйте целые числа — иначе возникнет TypeError. При выходе за диапазон возникает IndexError.

Пример TypeError:

s = "MAKEUSEOF"
print(s[1.5])  # TypeError: string indices must be integers

Пример IndexError:

s = "MAKEUSEOF"
print(s[88])  # IndexError: string index out of range

Срезы (slicing)

Срезы позволяют получить подпоследовательность с помощью двоеточия (start:stop:step). Практические варианты:

s = "MAKEUSEOF"
# От 0 (включительно) до 4 (исключая)
print(s[0:4])

# От 3-го с конца (включительно) до последнего (исключая)
print(s[-3:-1])

# От индекса 2 до конца
print(s[2:])

# От начала до индекса 6 (исключая)
print(s[:6])

Вывод:

MAKE
EO
KEUSEOF
MAKEUS

Совет: при отрицательном step срезы идут в обратную сторону: s[::-1] возвращает строку в обратном порядке.

Операторы для строк

Конкатенация: +

Оператор + объединяет строки.

s1 = "MAKE"
s2 = "USE"
s3 = "OF"
s = s1 + s2 + s3
print(s)  # MAKEUSEOF

Повторение: *

Оператор * повторяет строку заданное число раз.

s = "MUO-"
print(s * 5)
print(2 * s)
x = 3
print(s * x)

Вывод:

MUO-MUO-MUO-MUO-MUO-
MUO-MUO-
MUO-MUO-MUO-

Членство: in / not in

Оператор in проверяет, содержится ли подстрока в строке; возвращает True или False. not in — обратное.

s = "MAKEUSEOF"
print("MAKE" in s)   # True
print("H" in s)      # False
print("Hello" not in s)  # True
print("M" not in s)      # False

Экранированные последовательности

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

s = 'We are using apostrophe \' in our string'
print(s)

Вывод:

We are using apostrophe ' in our string

Полезные escape-последовательности: \n — новая строка, \t — табуляция, \ — сам backslash.

Важное замечание о Unicode: некоторые визуально один символы состоят из нескольких кодовых точек (combining marks). len() считает кодовые точки, а не визуальные «графемы».

Вставка переменных (интерполяция) — f-строки

F-строки (f”…”) позволяют вставлять выражения прямо в литерал.

s1 = "Piper"
s2 = "a"
s3 = "pickled"
str = f"Peter {s1} picked {s2} peck of {s3} peppers"
print(str)

a = 1
b = 2
c = a + b
print(f"Sum of {a} + {b} is equal to {c}")

Вывод:

Peter Piper picked a peck of pickled peppers
Sum of 1 + 2 is equal to 3

Совет по безопасности: никогда не выполняйте eval() над строками, полученными от пользователей. F-строки сами по себе не исполняют код, но комбинирование с eval небезопасно.

Встроенные функции для строк

len()

Возвращает длину строки (количество кодовых точек).

s = "MAKEUSEOF"
print(len(s))  # 9

ord() и chr()

ord(c) — кодовая точка символа; chr(i) — символ по числовому коду.

print(ord('M'))  # 77
print(ord('a'))  # 97
print(chr(77))   # 'M'
print(chr(36))   # '$'

str()

Преобразует объект в строку.

num = 73646
s = str(num)
print(s)
print(type(s))  # 

Разбиение и объединение строк

split()

Разбивает строку по разделителю и возвращает список.

str1 = "Peter-Piper-picked-a-peck-of-pickled-peppers"
splitted_list1 = str1.split('-')
print(splitted_list1)

str2 = "We surely shall see the sun shine soon"
splitted_list2 = str2.split(' ')
print(splitted_list2)

Вывод:

['Peter', 'Piper', 'picked', 'a', 'peck', 'of', 'pickled', 'peppers']
['We', 'surely', 'shall', 'see', 'the', 'sun', 'shine', 'soon']

join()

Объединяет элементы итерируемого объекта в строку, используя заданный разделитель.

list1 = ["I", "thought", "I", "thought", "of", "thinking", "of", "thanking", "you"]
str1 = "-".join(list1)
print(str1)

list2 = ["Ed", "had", "edited", "it"]
str2 = " ".join(list2)
print(str2)

Вывод:

I-thought-I-thought-of-thinking-of-thanking-you
Ed had edited it

Когда операции со строками дают сбой — частые ошибки и примеры

  • Неправильный тип индекса: s[1.5] → TypeError: string indices must be integers.
  • Выход за пределы: s[100] → IndexError: string index out of range.
  • Путаница bytes vs str: методы строк (например, .split()) работают с str; для байтов используйте bytes/bytearray и соответствующие методы.
  • Unicode: len() считает кодовые точки, но визуальная длина может отличаться при наличии комбинирующих знаков.

Альтернативы и смежные подходы

  • bytes/bytearray: для бинарных данных. bytes — неизменяемый, bytearray — изменяемый.
  • io.StringIO: для накопления большого текста эффективнее, чем многократная конкатенация.
  • textwrap и locale: для форматирования и локализации текста.

Краткая шпаргалка (cheat sheet)

  • Создание: ‘a’, “a”, ‘’’a’’’.
  • Индексация: s[i], s[-1].
  • Срезы: s[start:stop:step], s[::-1] — реверс.
  • Объединение: +, str.join(iterable).
  • Повторение: * n.
  • Форматирование: f”{expr}”.
  • Разбиение/соединение: .split(sep), sep.join(list).
  • Длиной: len(s).
  • Кодовые точки: ord(c), chr(i).

Мини-методология: как подойти к задаче обработки строк

  1. Определите тип данных: str или bytes?
  2. Выясните требуемую кодировку и нормализацию Unicode (если данные из внешних источников).
  3. Избегайте множественной конкатенации в циклах; используйте list + join или StringIO.
  4. Покройте граничные случаи тестами: пустая строка, очень длинная строка, строки с Unicode-комбинирующими символами.

Тесты и критерии приёмки

  • Критерии приёмки:

    • Функция корректно обрабатывает пустую строку.
    • Индексация и срезы возвращают ожидаемые подстроки.
    • При выходе за диапазон бросается IndexError.
    • При неверном типе индекса бросается TypeError.
    • Для локализованных данных применяется нужная нормализация Unicode.
  • Примеры тест-кейсов:

    • input: “abc”, index 1 → ‘b’.
    • input: “abc”, slice [0:2] → ‘ab’.
    • input: “”, split(‘,’) → [‘’] или [] в зависимости от контракта.

Ролевые чек-листы

  • Для разработчика:
    • Использовать str для текстовых данных.
    • Проверить кодировку при чтении/записи файлов.
    • Не использовать eval для строк от пользователя.
  • Для тестировщика:
    • Проверить граничные условия и Unicode-сценарии.
    • Проверить поведение при больших объемах и производительность.

Короткий словарь (1 строка)

  • строка: последовательность кодовых точек Unicode; неизменяема.
  • кодовая точка: численное представление символа (ord/chr).
  • графема: визуальный символ, может состоять из нескольких кодовых точек.

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

  • Для двоичных протоколов (используйте bytes).
  • Для очень частой мутации текста в циклах (лучше StringIO или list+join).

Итог

Строки — фундаментальная часть Python. Понимание неизменяемости, индексирования, срезов и особенностей Unicode помогает писать корректный и эффективный код. Используйте f-строки для удобной интерполяции, split/join для разбиения и объединения, и помните про отличие str и bytes.

Важное: тестируйте граничные сценарии и учитывайте нормализацию Unicode при работе с внешними источниками.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Защитить Plex-сервер через Raspberry Pi и HTTPS
Безопасность

Защитить Plex-сервер через Raspberry Pi и HTTPS

Чёткие контурные линии в Procreate
Procreate

Чёткие контурные линии в Procreate

CSS Modules в React — локальные стили без конфликтов
Frontend

CSS Modules в React — локальные стили без конфликтов

Создать ISO из папки в Windows через CMD
Windows

Создать ISO из папки в Windows через CMD

Как сделать снимок экрана на ноутбуке
How-to

Как сделать снимок экрана на ноутбуке

Как настроить и использовать Apple Pay на Mac
Mac

Как настроить и использовать Apple Pay на Mac