Методы и функции строк в Python
Расскажем о самом популярном: дублировании, сложении, подсчёте длины, замене символов и работе с индексом.
Иллюстрация: Оля Ежак для Skillbox Media
Строковый тип данных — один из основных типов данных в Python. Он используется для хранения символьной информации: букв, чисел, знаков препинания и других символов. Например, отлично подходит для записи ФИО или адресов клиентов в базах данных.
В этой статье разберём полезные методы работы со строкам и узнаем, как их складывать, умножать, научимся считать индексы в строковых переменных попрактикуемся с кодом. Приступим!
Содержание
Вспомним, что такое строки
Строковый тип данных — это последовательности символов Unicode любой длины, заключённые в одинарные, двойные или тройные кавычки. Символами могут быть буквы, числа, знаки препинания, специальные символы и так далее. Главное — чтобы их с двух сторон окружали кавычки. В Python текстовый тип данных обозначается буквами str (от англ. string — строка).
Например, создадим три переменных, используя разное число кавычек:
Проверим, действительно ли мы создали переменные нужного типа. Для этого воспользуемся функцией type:
Запустим код и посмотрим на результат:
Да. Все три переменные имеют тип str, то есть являются строковыми.
Разберём подробнее, какие операции можно производить над строками, и поговорим про функции и методы этого типа данных.
Работа со строками в Python: базовые операции
Перед тем как перейти к конкретным действиям, напомним что строки в Python — неизменяемый тип данных. Это означает, что строковую переменную нельзя изменить с помощью операторов, функций и методов. Если мы хотим сохранить результат изменения существующей строки, то надо создать новую переменную.
Начнём! Разберём основные виды операций над строками. Запускайте любимый редактор кода и повторяйте действия за нами.
Сложение (конкатенация)
Строки, как и числа, можно складывать, проще говоря, склеивать между собой с помощью оператора +. Эту операцию иногда называют «сцеплением».
Например:
Результат:
Здесь, в отличие от сложения чисел, перестановка мест слагаемых меняет результат:
Результат
Это важно помнить, не путая сложение строк со сложением чисел. В математическом плане это разные действия.
Вычитание
Настоящей операции вычитания строк, по аналогии с числами, в Python не существует — мы не сможем отнять символы из строки с помощью операции −. Но можно использовать метод replace().
Он создаёт новую строку путём замены частей исходной строки. Лучше всего показать это на примере. Попробуем удалить часть слова, заменив её пустой строкой:
В результате получим:
Дублирование (умножение)
В языке Python строки можно умножать на целые числа. Операция работает просто — повторяет содержимое переменной указанное количество раз. Например:
В результате получим:
Операцию умножения удобно использовать, если строку нужно продублировать много раз без ручного ввода. Например:
Результат:
Принадлежность строки
Иногда разработчикам приходится проверять, есть ли в составе строки определённый фрагмент, который называют подстрокой. Например, мы хотим подтвердить наличие пользователя с определённым именем в нашей базе данных, где имя хранится вместе с фамилией — Иван Иванов. Строка здесь — это Иван Иванов, а нужная нам подстрока — Иван. Как это проверить? Воспользуемся проверкой принадлежности строки.
Для этого воспользуемся оператором in. Он возвращает True, если одна подстрока входит в состав строки, в противном случае возвращает False.
Например:
С помощью оператора in можно упростить поиск строк в разных переменных. Например, нам необходимо проверить наличие символа в четырёх строковых переменных. Мы можем написать такой код:
Выглядит сложно. Упростим его, объединив содержимое переменных в одну строку:
Не забывайте, что регистр символов имеет значение. Например, буквы «A» и «a» компьютер воспринимает как разные.
Определение длины строки
Это количество содержащихся в строке символов, включая пробелы. Чтобы определить длину строки, используется функция len() (от англ. length — длина). Например:
Результат выполнения:
Доступ по индексу
Чтобы выделить один символ строки, используют индексацию. Нумерация символов начинается с нуля и заканчивается длиной строки −1.
Например, посмотрим на индексацию строковой переменной, значение которой равно 'Skillbox':
s | k | i | l | l | b | o | x |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Мы видим, что нумерация начинается с нуля, а заканчивается числом 7, то есть равна количеству символов в строке с вычетом единицы.
Чтобы распечатать символы по их индексу, его необходимо указать в квадратных скобках. Вот так:
В результате выполнения кода получим:
Если мы попытаемся использовать индекс больший, чем количество символов в строке, то получим ошибку. Проверим:
Результат выполнения:
Индексацию также можно начинать с конца строки. В таком случае последний символ будет иметь индекс, равный −1, а индекс первого символа будет равен длине строки со знаком −. Посмотрим на такую индексацию на нашем примере:
s | k | i | l | l | b | o | x |
-8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
Если мы используем индекс меньше отрицательного значения длины строки, программа также выдаст ошибку IndexError, например:
В результате получим:
Срез строки
Если нам нужно получить не один символ, а часть строки, используются срезы. Срез с двумя параметрами выглядит так:
st[начальный индекс:конечный индекс]
Срез извлекает подстроку, начиная c начального индекса (включительно) и заканчивая последним индексом (не включая его), то есть символ с конечным индексом в срез не входит. Не забывайте, что индексация строки начинается с 0.
Например:
Результат выполнения кода:
Если не указывать начальный индекс, то срез берётся с начала строки. Если не указывать конечный — то до конца строки. Если опустить оба параметра, то срез возвращает всю строку. Попробуем несколько вариантов:
Получаем срезы:
Если мы зададим конечный индекс среза больше, чем количество символов в строке, то ошибки не будет. В этом случае программа возвращает срез до конца строки.
Например:
Получим срез:
Срез, в котором начальный индекс больше или равен конечному, возвращает пустую строку, например:
Этот код вернёт пустые строки, но ошибки не будет. Можете проверить в своём редакторе кода.
Индексы могут быть не только положительными, но и отрицательными. В этом случае отсчёт начинается с конца строки. Главное условие — начальный индекс должен быть меньше конечного или пропущен, иначе результатом будет пустая строка.
Например, программный код:
Полученный результат:
Шаг извлечения среза
В срез можно добавить третий параметр, который будет означать шаг извлечения символов.
Например, если мы возьмём срез st[0:6:2] строки st = 'Python', то получим строку 'Pto':
P | y | t | h | o | n |
---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
Рассмотрим пример с отрицательными индексами. Например, срез st[-6:-1:2] строки st = 'Python' тоже будет равен 'Pto':
P | y | t | h | o | n |
---|---|---|---|---|---|
−6 | −5 | −4 | −3 | −2 | −1 |
Шаг среза может быть отрицательным. В этом случае начальный индекс должен быть больше конечного. Символы будут включаться в срез в обратном порядке.
Например, срез st[-3:-7:-2] возвращает строку 'hy'. Как видим, правая граница здесь не включается в срез.
P | y | t | h | o | n |
---|---|---|---|---|---|
−6 | −5 | −4 | −3 | −2 | −1 |
Отрицательный шаг можно использовать с положительными индексами, например:
Результат выполнения:
Чтобы вывести символы строки в обратном порядке, удобно использовать срез [::−1], например:
В результате выполнения получим:
Работа со срезами может казаться сложной — надо правильно задавать интервал, шаг или даже использовать отрицательные индексы. Попробуйте попрактиковаться на разных примерах, меняя параметры среза. Через пару десятков слов точно получится разобраться.
Таблица методов и функций строк
Для строк существует несколько десятков полезных методов и функций, позволяющих преобразовывать текстовые переменные. Подробнее с ними можно ознакомиться в официальной документации. Собрали в таблицу наиболее популярные из них:
S.find(str, [start], [end]) | Поиск подстроки str в строке S в интервале индексов (start, end). Возвращает индекс первого совпавшего значения подстроки. Если подстрока не найдена, возвращает −1. Здесь start и end — необязательные аргументы. Если они не заданы, поиск ведётся во всей строке |
S.rfind(str, [start], [end]) | Поиск подстроки str в строке S в интервале индексов (start, end). Возвращает индекс последнего совпавшего значения подстроки. Если подстрока не найдена, возвращает −1. Здесь start и end — необязательные аргументы. Если они не заданы, поиск ведётся во всей строке |
S.count(t) | Возвращает количество непересекающихся вхождений подстроки t в строку S. То есть метод начинает искать следующую подстроку строго после окончания предыдущей. Например, в строке s = 'ababab' есть два пересекающихся вхождения 'abab', но непересекающееся вхождение одно. Метод вернёт единицу |
S.isdigit() | Проверяет, состоит ли строка из цифр. Если да, возвращает True, иначе — False |
S.upper() | Преобразует символы строки к верхнему регистру. Заглавные буквы и символы, которые не относятся к буквам, не меняются |
S.lower() | Преобразует символы строки к нижнему регистру. Строчные буквы и символы, которые не относятся к буквам, не меняются |
S.lstrip([символ]) | Удаляет определённые символы в начале строки. Здесь [символ] — необязательный аргумент. Если он не задан, метод удаляет пробелы |
S.rstrip([символ]) | Удаляет определённые символы в конце строки. Здесь [символ] — необязательный аргумент. Если он не задан, метод удаляет пробелы |
S.split([разделитель [, maxsplit]]) | Разбивает строку по разделителю и возвращает список, содержащий подстроки. Если разделитель не задан, то строка разбивается по пробелу, символу перевода строки или табуляции. maxsplit — необязательный аргумент, определяет максимальное количество частей, на которые разбивается строка. Если он не задан, то количество фрагментов не ограничивается. При заданном maxsplit максимальное количество элементов в списке равно maxsplit+1 |
chr(число) | Преобразует код ASCII в символ |
ord(символ) | Преобразует символ в его код ASCII |
sorted(строка) | Сортирует символы строки в порядке возрастания их номеров в таблице ASCII |
list(строка) | Возвращает список, состоящий из символов строки |
Примеры кода
Рассмотрим несколько практических примеров использования функций и методов.
Методы поиска подстроки
К ним относятся два метода: S.find(str, [start], [end]) и S.rfind(str, [start], [end]).
Результат выполнения кода:
Если подстроки в строке нет, Python возвращает −1:
Результат:
Поиск в срезе:
Результат:
Здесь подстрока str ищется в срезе S[0:7]. Так как правая граница в срез не включается, Python не находит подстроку и выдаёт −1.
Методы преобразования символов строки в верхний и нижний регистры
Для преобразования используются два метода:
- S.upper() — преобразование всех символов строки S в верхний регистр.
- S.lower() — преобразование всех символов строки S в нижний регистр.
И тот и другой метод возвращают новую строку, а исходная остаётся прежней.
Например:
В результате получим:
Если мы хотим сохранить результат, то результат выполнения метода надо присвоить новой переменной.
Метод разбиения строки по разделителю
Для разбиения строки по разделителю используется метод S.split([разделитель [, maxsplit]]). Посмотрим на него в коде:
Результат:
Методы rjust() и ljust():
В результате выполнения получим:
Мы рассмотрели понятия строки и текстового типа данных в Python. Подробно со всеми методами и функциями строк можно ознакомиться в документации.