Бесплатный курс по Python. Зарегистрируйтесь для отслеживания прогресса →

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

Когда мы работаем со строками в программировании, из них регулярно приходится извлекать некую часть. Например, нам нужно выяснить, присутствует ли меньшая строка внутри большей. В этом уроке мы разберемся, как это сделать.

Подстрока — это некоторая часть строки, которую нужно найти и извлечь.

Представим, что у нас есть дата в таком формате: 12-08-2034. Нам нужно извлечь из нее подстроку, в которую входит только год.

Если подумать логически, то нужно посчитать индекс символа, с которого начинается год, и затем извлечь четыре символа. Индексы в строке начинаются с нуля, значит, первый символ года доступен по индексу 6, а последний символ — по индексу 9. Проверим:

value = '12-08-2034'

print(value[6])  # => 2
print(value[9])  # => 4

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

value = '12-08-2034'

year = value[6:10]
print(year)  # => 2034

Срезы для строк в Python — это механизм, с помощью которого извлекается подстрока по указанным параметрам. В примере выше мы взяли подстроку с 6 индекса по 10 индекс, не включая, то есть с 6 по 9 включительно. Формула выглядит так:

str[начальный индекс:конечный индекс]

# Пара примеров
value = '01-12-9873'

# Срез строки это всегда строка,
# даже если внутри строки было число.
value[1:2]  # '1'
value[3:5]  # '12'

Срезы — механизм с большим количеством вариаций. Например, если не указать вторую границу, то извлечение произойдет до конца строки. То же самое с первой границей — началом строки:

value = 'Hexlet'
value[3:]  # 'let'
value[:3]  # 'Hex'

Можно указать даже отрицательные индексы. В таком случае отсчет идет с обратной стороны:

value = 'Hexlet'
# Правая граница отрицательная. Считаем -1 от конца строки
value[3:-1]  # 'le'
# Левая граница отрицательная. Считаем -5 от конца строки
value[-5:3]  # 'ex'

У срезов два обязательных параметра, но иногда используется и третий.

У срезов есть третий необязательный параметр — шаг извлечения. По умолчанию он равен единице, но мы можем его изменить:

value = 'Hexlet'
value[1:5:2]  # el
# 1:5 это 'exle'
# шаг 2 это каждый второй, то есть 'e' и 'l'

Все это можно комбинировать с открытыми границами, то есть без указания начала или конца:

value = 'Hexlet'
value[:5:2]  # 'Hxe'
value[1::2]  # 'elt'

Шаг может быть отрицательным, в таком случае он берется с конца. Из этого вытекает самый популярный способ использования шага — переворот строки:

value = 'Hexlet'
# Пропускаем обе границы
value[::-1]  # 'telxeH'

Если используется отрицательный шаг, и элементы среза извлекаются в обратном порядке — тогда и границы среза тоже нужно указывать в обратном порядке. Первой указывается правая граница среза, второй — левая:

value = 'Hexlet'
# Символ с индексом 1 не будет включен в подстроку
value[4:1:-1]  # 'elx'

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

value = 'Hexlet'
start = 1
end = 5
value[start:end]  # 'exle'

https://replit.com/@hexlet/python-basics-advanced-strings-slices

Соберем все вместе:

value = 'Hexlet'
value[::] = 'Hexlet'  # Вся строка
value[:] = 'Hexlet'  # Вся строка
value[::2] = 'Hxe'  # Четные по порядку символы
value[1::2] = 'elt'  # Нечетные по порядку символы
value[::-1] = 'telxeH'  # Вся строка в обратном порядке
value[5:] = 't'  # Строка, начиная с шестого символа
value[:5] = 'Hexle'  # Строка до шестого символа
value[-2:1:-1] = 'elx'  # Все символы с предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг

Как видите, срезы способны на многое. Не переживайте, если прямо сейчас не запомните все эти комбинации — это нормально. Со временем вы научитесь их использовать, не подглядывая в документацию.

Задание

В переменной value лежит значение Hexlet. Извлеките из него и выведите на экран срез, который получит подстроку xle. Это задание можно сделать разными способами.

Упражнение не проходит проверку — что делать? 😶

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет 🤨

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя 🤔

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно 🙄

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Определения

  • Срезы для строк — механизм, с помощью которого извлекается подстрока по указанным параметрам.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе