Срезы строк
Срезы строк в 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 никогда не входит в срез.
Базовый срез строки
Укажите начальный и конечный индексы через двоеточие, чтобы извлечь символы между ними.
my_string[0:3] возвращает символы на позициях 0, 1 и 2 — символ с индексом 3 ('l') не включается.
Пропуск start или stop
Опустите start, чтобы начать с самого первого символа, или опустите stop, чтобы продолжить до последнего символа.
my_string[:] — распространённый идиоматический способ скопировать строку (хотя строки в Python неизменяемы, поэтому он просто возвращает то же значение).
Отрицательные индексы
Отрицательные индексы ведут отсчёт от конца строки в обратную сторону. -1 соответствует последнему символу, -2 — предпоследнему и так далее.
Полезный шаблон: my_string[-n:] всегда возвращает последние n символов, независимо от длины строки.
Параметр шага
Третий аргумент среза — шаг. Он определяет, на сколько позиций Python продвигается после выбора каждого символа.
Обращение строки
Задайте шаг -1, чтобы итерировать справа налево. Это идиоматический способ обратить строку в Python:
Можно комбинировать отрицательный шаг с индексами 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.
Индексы вне диапазона
В отличие от прямого обращения по индексу (которое вызывает 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 Methods —
upper(),strip(),split(),replace()и другие - Modify Strings — техники преобразования содержимого строк
- Concatenate Strings — объединение строк с помощью
+иjoin() - Escape Characters —
\n,\t,\\и другие специальные последовательности - Format Strings — встраивание значений в строки с f-строками и
.format()