Все статьи по Python
24 янв. 2025 г. - 14 мин. чтения
Работа со строками

Работа со строками

Интерполяция. Извлечение символов из строки. Срез строки

@ashtana

Штана Альберт Игоревич

Работа со строками в Python

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

Интерполяция

Базовый способ соединения строк — конкатенация. С помощью конкатенации строки «суммируются» друг с другом, как в примере ниже:

first_name = 'Jack'
last_name = 'London'

print(first_name + " " + last_name + "!")
# => Jack London!

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

first_name = 'Jack'
last_name = 'London'

print(f'{first_name} {last_name}!')
# => Jack London!

Буква f указывает на то, что мы создаем f-строку — шаблон, в который с помощью фигурных скобок подставляются значения переменных. На выходе получается обычная строка. Рассмотрим такой пример:

lesson = 'Информатика'

best_subject = f'{lesson} - лучший предмет!'
print(best_subject)  # => Информатика - лучший предмет!

Почти во всех языках для объединения строк интерполяция предпочтительнее конкатенации. Строка при этом получается склеенная, и внутри нее хорошо просматриваются пробелы и другие символы. Интерполяция помогает сделать код более понятным для разработчиков. Но это не единственная полезная альтернатива. Далее разберемся, как объявлять многострочную строку и не использовать символ новой строки \n.

Multi-line строки

Представьте, что нужно определить строку, которая состоит из нескольких строчек — то есть внутри есть переводы строки \n. Например, она будет выглядеть так:

text = 'Пример текста,\nсостоящего из\nнескольких строк'

На печати строка примет совсем другой вид:

Пример текста,
состоящего из
нескольких строк

Для таких ситуаций в Python есть еще один способ создания строк, который называется multi-line строки. Чтобы описать такую «многострочную строку», нужно заключить ее в тройные кавычки — """ или '''. Внутри multi-line строки можно переносить текст и не использовать перевод строки \n:

text = '''Пример текста,
состоящего из
нескольких строк'''
Пример текста,
состоящего из
нескольких строк

Благодаря тройным кавычкам multi-line строки позволяют не экранировать кавычки внутри строки. Еще multi-line строки могут становиться f-строками для интерполяции:

a = 'A'
b = 'B'
text = f'''{a} и {b}
сидели на трубе
'''
А и B
сидели на трубе

Для компьютера не важно, какие способы соединения и переноса строк вы будете использовать. Интерполяция и multi-line строки используются для удобства разработчиков, чтобы им было проще читать код.

Извлечение символов из строки

Иногда нужно получить один символ из строки. Например, если сайт знает имя и фамилию пользователя, и в какой-то момент требуется вывести эту информацию в формате И. Иванов. Для этого компьютеру потребуется взять первый символ из имени. В Python есть подходящая операция.

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

Представим, что из имени Иван нужно вывести на экран только первую букву. Это выглядит так:

name = 'Иван'
print(name[0])  # => И

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

# Длина строки 9, поэтому последний индекс — это 8
first_name = 'Александр'
print(first_name[8])  # => р
print(first_name[9])  # => IndexError: string index out of range

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

x = '\nyou'
print(x[1])

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

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

Допустимо использовать отрицательные индексы. В этом случае идет обращение к символам, начиная с конца строки. -1 — индекс последнего символа, -2 — предпоследнего и так далее. В отличие от прямой индексации, обратный отсчет идет от -1:

name = 'Александр'
print(name[-1])  # => р

Индексом может быть не только конкретное число, но и значение переменной. Посмотрите на пример ниже. Здесь записали индекс внутри квадратных скобок не числом, а переменной. Такой код приведет к тому же результату — выводу на экран символа А:

name = 'Александр'
i = 0
print(name[i])  # => А

Чтобы выводить из выражения лишь некоторые символы, не нужно писать большое количество строк кода — достаточно извлечь элемент с помощью индекса. Также можно пользоваться отрицательным индексом, чтобы легче выводить символы с конца выражения. Далее разберемся, как с помощью этих знаний можно извлекать подстроки из строки.

Срезы строк

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

Подстрока и срезы для строк

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

data = '12-08-2025'
print(data[6])  # => 2
print(data[9])  # => 5

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

data = '12-08-2025'
year = data[6:10]
print(year)  # => 2025

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

data = '24-01-2025'
data[1:2]  # '4'
data[3:5]  # '01'

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

value = 'Python'
value[3:]  # 'hon'
value[:3]  # 'Pyt'

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

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

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

Шаг извлечения

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

data = 'Python'
data[1:5:2]   # => yh

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

value = 'Python'
value[:5:2]  # 'Pto' символы берутся от начала до 5 индекса через один
value[1::2]  # 'yhn' символы берутся от 1 индекса до конца через один

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

value = 'Python'
value[::-1]  # 'nohtyP'

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

value = 'Python'
value[4:1:-1]  # 'oht'

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

value = 'Python'
begin = 1
end = 5
value[begin:end]  # 'ytho'

Всё вместе:

value = 'Python'
value[::]  # 'Python'  # Вся строка
value[:]  # 'Python'  # Вся строка
value[::2]  # 'Pto'  # Нечетные по порядку символы
value[1::2]  # 'yhn'  # Четные по порядку символы
value[::-1]  # 'nohtyP'  # Вся строка в обратном порядке
value[5:]  # 'n'  # Строка, начиная с шестого символа
value[:5]  # 'Pytho'  # Строка до шестого символа
value[-2:1:-1] # 'oht'  # Все символы с предпоследнего до третьего в обратном порядке

Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг.

Попробуйте сами запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает. Для этого в ячейке с кодом нажмите клавиши на клавиатуре Shift+Enter или запустите код через кнопку Run по значку ▶.