W3docs

Срезы строк

Срезы строк в Python: синтаксис, индексы, шаг, отрицательные индексы и практические примеры.

Срезы строк в Python

Срез строки позволяет извлечь подстроку из более длинной строки, указав начало, конец и количество символов, которые нужно пропускать за один шаг. Это одна из самых распространённых операций со строками в Python, которая применяется повсюду — от разбора имён файлов до обращения слов.

В этой главе рассматриваются:

  • Синтаксис [start:stop:step] и соответствие индексов символам
  • Пропуск start или stop (срез с начала или до конца)
  • Отрицательные индексы (отсчёт с правой стороны)
  • Параметр шага (пропуск символов, обращение строки)
  • Типичные ошибки: индексы вне диапазона, пустые срезы
  • Практические примеры, которые можно запустить сразу

Если вы только начинаете работать со строками в Python, сначала прочитайте главу Python Strings — в ней объясняется, как создаются и индексируются строки.

Как работают индексы строк

Каждый символ строки Python имеет два индекса: положительный (отсчёт слева, начиная с 0) и отрицательный (отсчёт справа, начиная с -1).

Для строки "Hello, World!":

 H   e   l   l   o   ,       W   o   r   l   d   !
 0   1   2   3   4   5   6   7   8   9  10  11  12   ← positive
-13 -12 -11 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1  ← negative

Полный синтаксис среза:

string[start:stop:step]
  • start — индекс первого включаемого символа (по умолчанию: 0)
  • stop — индекс первого исключаемого символа (по умолчанию: конец строки)
  • step — шаг продвижения после каждого символа (по умолчанию: 1)

Индекс stop не включается в результат — символ с индексом stop никогда не входит в срез.

Базовый срез строки

Укажите начальный и конечный индексы через двоеточие, чтобы извлечь символы между ними.

python— editable, runs on the server

my_string[0:3] возвращает символы на позициях 0, 1 и 2 — символ с индексом 3 ('l') не включается.

Пропуск start или stop

Опустите start, чтобы начать с самого первого символа, или опустите stop, чтобы продолжить до последнего символа.

python— editable, runs on the server

my_string[:] — распространённый идиоматический способ скопировать строку (хотя строки в Python неизменяемы, поэтому он просто возвращает то же значение).

Отрицательные индексы

Отрицательные индексы ведут отсчёт от конца строки в обратную сторону. -1 соответствует последнему символу, -2 — предпоследнему и так далее.

python— editable, runs on the server

Полезный шаблон: my_string[-n:] всегда возвращает последние n символов, независимо от длины строки.

Параметр шага

Третий аргумент среза — шаг. Он определяет, на сколько позиций Python продвигается после выбора каждого символа.

python— editable, runs on the server

Обращение строки

Задайте шаг -1, чтобы итерировать справа налево. Это идиоматический способ обратить строку в Python:

python— editable, runs on the server

Можно комбинировать отрицательный шаг с индексами start и stop. Помните: при отрицательном шаге start должен быть больше stop.

my_string = "Hello, World!"
print(my_string[10:2:-1])  # 'lroW ,ol' — from index 10 down to (not including) index 2

Дополнительные техники, включая reversed() и ''.join(), смотрите в главе Reverse a String.

Комбинирование start, stop и step

Все три части работают совместно. Воспринимайте срез как цикл for, который начинается с start, останавливается перед stop и увеличивается на step.

python— editable, runs on the server
python— editable, runs on the server

Индексы вне диапазона

В отличие от прямого обращения по индексу (которое вызывает IndexError при выходе за пределы), срезы обрабатывают значения вне диапазона безопасно, обрезая их до границ строки.

my_string = "Hello, World!"

# Stop index beyond the string length — no error
print(my_string[7:100])  # 'World!'

# Start index beyond the string length — returns empty string
print(my_string[50:60])  # ''

# Direct index access would raise IndexError:
# print(my_string[100])  # IndexError: string index out of range

Это делает срезы безопасными для шаблона «дать не более N символов» без предварительной проверки len().

Практические примеры

Получение расширения файла

filename = "report.pdf"
extension = filename[-3:]
print(extension)  # 'pdf'

Извлечение домена из адреса электронной почты

email = "[email protected]"
at_index = email.index("@")
domain = email[at_index + 1:]
print(domain)  # 'example.com'

Усечение длинной строки с многоточием

def truncate(text, max_length):
    if len(text) <= max_length:
        return text
    return text[:max_length - 3] + "..."

print(truncate("Hello, World!", 8))   # 'Hello...'
print(truncate("Hi", 8))             # 'Hi'

Проверка, является ли строка палиндромом

word = "racecar"
is_palindrome = word == word[::-1]
print(is_palindrome)  # True

Краткий справочник

ВыражениеЗначение
s[a:b]Символы с индекса a до (не включая) b
s[:b]От начала до (не включая) b
s[a:]От индекса a до конца
s[:]Полная копия
s[a:b:n]Каждый n-й символ от a до b
s[::-1]Обращённая строка
s[-n:]Последние n символов
s[:-n]Всё, кроме последних n символов

Что читать дальше

  • Python Strings — создание строк, индексация и неизменяемость
  • String Methodsupper(), strip(), split(), replace() и другие
  • Modify Strings — техники преобразования содержимого строк
  • Concatenate Strings — объединение строк с помощью + и join()
  • Escape Characters\n, \t, \\ и другие специальные последовательности
  • Format Strings — встраивание значений в строки с f-строками и .format()

Практика

Практика
Что вернёт срез `s[2:5]` для строки `'Python'`?
Что вернёт срез `s[2:5]` для строки `'Python'`?
Was this page helpful?