Когда мы работаем со строками в программировании, из них регулярно приходится извлекать некую часть. Например, нам нужно выяснить, присутствует ли меньшая строка внутри большей. В этом уроке мы разберемся, как это сделать.
Подстрока — это некоторая часть строки, которую нужно найти и извлечь.
Представим, что у нас есть дата в таком формате: 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
. Это задание можно сделать разными способами.
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Срезы для строк — механизм, с помощью которого извлекается подстрока по указанным параметрам.