Программируя на Python, мы уже сталкивались как с функциями, так и с методами. Функции не привязаны к объектам и вызываются независимо от них. Например, функция id() возвращает уникальный идентификатор объекта, а функция print() выводит данные на экран.

Однако методы, напротив, принадлежат определённым типам данным (классам) и используются только совместно с объектом, к которому относятся. Например, уже рассмотренный метод dict.values() возвращает последовательность значений словаря dict.

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

Но строки являются неизменяемым типом данных, поэтому методы, преобразующие строку, на самом деле не изменяют её, а возвращают изменённую копию исходной строки, которую следует сразу использовать в работе или присвоить какой-либо переменной.

Изменение регистра букв строки

Прежде всего, вспомним, что буквы могут находиться в двух регистрах:

  • нижний регистр – маленькие или строчные буквы ("ведомство");
  • верхний регистр – заглавные или прописные буквы ("КГБ").

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

Приведение строки к единому регистру

Для преобразования всех букв строки в нижний регистр предназначен метод str.lower() а для приведения к верхнему регистру – метод str.upper().

Метод

str.lower()

Описание

Приводит все буквы строки str к нижнему регистру

Возвращаемое значение

Преобразованная копия строки

Метод

str.upper()

Описание

Приводит все буквы строки str к верхнему регистру

Возвращаемое значение

Преобразованная копия строки

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

message1 = input()
if message1.lower() == "привет":
    print("И тебе привет, дорогой друг!")
# Ввод: ПрИвЕт
# Вывод: И тебе привет, дорогой друг!

message2 = input()
if message2.upper() == "ПОКА":
    print("И тебе всего хорошего!")
# Ввод: покА
# Вывод: И тебе всего хорошего!

Изменение регистра отдельных частей строки

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

Метод str.capitalize() преобразует первую букву строки в верхний регистр, а все остальные – в нижний, а метод str.title() приводит к верхнему регистру первую букву каждого слова в строке, а остальные буквы делает строчными.

Метод

str.capitalize()

Описание

Приводит первую букву строки str к верхнему регистру, а все остальные – к нижнему

Возвращаемое значение

Преобразованная копия строки

Метод

str.title()

Описание

Приводит первую букву каждого слова строки str к верхнему регистру, а остальные – к нижнему

Возвращаемое значение

Преобразованная копия строки

Метод str.capitalize() часто используется для форматирования предложений, имен собственных или заголовков, где необходимо выделить начало строки:

name = "иван"
print(name.capitalize())
# Вывод: Иван

article = "Самая ВКУСНАЯ оКрОшКа всего за 30 МИНУТ"
print(article.capitalize())
# Вывод: Самая вкусная окрошка всего за 30 минут

И если метод str.capitalize() приводит строку к виду предложения, то метод str.title() основан на правилах написания заголовков в английском языке, где каждое значимое слово начинается с заглавной буквы:

book = "Learn PYTHON the HARD WAY"
print(book.title())
# Вывод: Learn Python The Hard Way

Слова в строке определяются как последовательности букв, разделенные любыми небуквенными символами, в том числе апострофами:

message = "What's up, bro?"
print(message.title()) 
# Вывод: What'S Up, Bro?

Но если строка состоит из одного слова, то результаты методов str.title() и str.capitalize() совпадут:

city = "черепОВЕЦ"
print(city.capitalize())
# Вывод: Череповец
print(city.title())
# Вывод: Череповец

Удаление символов в начале и в конце строки

При копировании данных из разных источников, а также при вводе данных пользователем в начале и конце строки могут содержать пробелы и другие лишние символы. Если они мешают дальнейшей обработке строки, то их можно убрать с помощью метода str.strip().

Метод

str.strip(chars=" ")

Описание

Удаляет в начале и конце строки str символы chars

Параметры

Необязательные параметры:

  • chars – строка символов, которые нужно удалить, по умолчанию chars=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

По умолчанию метод удаляет пробелы, а также символы табуляции и перевода строки:

name = "  Жуков Георгий Константинович!!!\t\t\n   "
print("Приветствую,", name.strip()) 
# Вывод: Приветствую, Жуков Георгий Константинович!!!

Но параметр chars позволяет явно указать символы для удаления:

name = "  zzz!Кутузов, Михаил Илларионович!zzz  "
print("Приветствую,", name.strip("!z "))
# Вывод: Приветствую, Кутузов, Михаил Илларионович!

Порядок символов в строке chars не имеет значения, удаляются все вхождения любого из этих символов в начале и конце строки.

Если требуется удалить символы только в начале или только в конце строки, то у метода str.strip() есть варианты с префиксами «l» (от англ. left – лево) и «r» (от англ. right – право), которые удаляют символы слева или справа соответственно. Такое использование префиксов характерно для многих методов в Python.

Метод

str.lstrip(chars=" ")

Описание

Удаляет в начале строки str символы chars

Параметры

Необязательные параметры:

  • chars – строка символов, которые нужно удалить, по умолчанию chars=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

Метод

str.rstrip(chars=" ")

Описание

Удаляет в конце строки str символы chars или пробелы

Параметры

Необязательные параметры:

  • chars – строка символов, которые нужно удалить, по умолчанию chars=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

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

name = "    Райковский Викентий Логгинович"
print(name.lstrip())
# Вывод: Райковский Викентий Логгинович

Или при копировании данных из файла лишние символы подчеркивания могут появиться только в конце строки:

occupation = "Генерал___"
print(occupation.rstrip("_"))
# Вывод: Генерал

Замена символов в строке

Если нужно не просто обрезать символы в начале и конце строки, а заменитьодни символы на другие, то для этого предназначен метод str.replace().

Метод

str.replace(old, new, count=-1)

Описание

Заменяет все (или count) вхождения подстроки old на подстроку new в строке str

Параметры

  • old – подстрока, которую необходимо заменить
  • new – новая подстрока, которая заменит old

Необязательные параметры:

  • count – максимальное количество замен, по умолчанию count=-1, что означает замену всех вхождений

Возвращаемое значение

Преобразованная копия строки

В самом простом случае методу str.replace() достаточно передать заменяемое и новое значение:

poetic_line = "Ласточка с весною в сени к нам летит." 
new_poetic_line = poetic_line.replace("Ласточка", "Голубка")
print(new_poetic_line)
# Вывод: Голубка с весною в сени к нам летит.

Но с помощью параметра count можно ограничить количество замен:

poetic_line = "С нею солнце краше. И весна милей..." 
new_poetic_line = poetic_line.replace("с", "S", 3)
print(new_poetic_line)
# Вывод: С нею Sолнце краше. И веSна милей.... 

Если подстрока для замены не найдена, метод str.replace() возвращает исходную строку без изменений:

poetic_line = "Прощебечь с дороги нам привет скорей!" 
new_poetic_line = poetic_line.replace("дам тебе я зерен", "песню спой")
print(new_poetic_line)
# Вывод: Прощебечь с дороги нам привет скорей!

Разбиение строки на список

Метод str.split() преобразует строку в список подстрок, разделяя её по пробелу или указанному разделителю.

Метод

str.split(sep=" ", maxsplit=-1)

Описание

Разделяет строку str на список подстрок, используя в качестве разделителя строку sep

Параметры

Необязательные параметры:

  • sep – строка-разделитель, по умолчанию sep=" " (пробел)
  • maxsplit – максимальное количество разбиений, по умолчанию maxsplit=-1, то есть без ограничений

Возвращаемое значение

Список строк

Например, у нас есть строка с жанрами фильмов, и с помощью метода str.split() мы можем разбить её на список, используя запятую в качестве разделителя:

genres = "комедия,фантастика,романтика"
genres_list = genres.split(",")
print(genres_list)
# Вывод: ['комедия', 'фантастика', 'романтика']

Если значение разделителя sep не указано, то строка разбивается по пробельным символам (пробел, табуляция, перенос строки) как по одному, так и по нескольким подряд:

musicals = "Кабаре Отверженные    Эвита"
print(musicals.split())
# Вывод: ['Кабаре', 'Отверженные', 'Эвита']

Параметр maxsplit позволяет ограничить количество разбиений. Тогда будет произведено не более maxsplit разбиений, а остаток строки будет добавлен в список как последний элемент:

message = "Он купил хлеб, молоко, колбасу и конфеты"
lst = message.split(",", 1)
print(lst)
# Вывод: ['Он купил хлеб', ' молоко, колбасу и конфеты']

Здесь строка разбивается на две части только по первой запятой.

Объединение элементов коллекции в строку

В то время как метод str.split() разделяет строку на список подстрок, метод str.join(), наоборот, объединяет все элементы коллекции (которые должны быть строками) в одну новую строку.

Метод

str.join(iterable)

Описание

Объединяет элементы итерируемого объекта iterable в строку, разделяя их строкой str

Параметры

  • iterable – итерируемый объект, элементы которого объединяются в строку

Возвращаемое значение

Строка

Этот метод берет каждую строку из коллекции и вставляет строку-разделитель между ними, тем самым создавая новую строку:

sentence = ["Сегодня", "идёт", "снег"]
sep = " "
sentence_str = sep.join(sentence)
print(sentence_str)
# Вывод: Сегодня идёт снег

При этом, если хотя один элемент объединяемой коллекции не является строкой, то вызывается исключение TypeError:

grades = ["Отлично", "Хорошо", 3]
sep = " "
grades_str = sep.join(grades)
# Ошибка: TypeError: sequence item 2: expected str instance, int found

Выравнивание строк

Методы выравнивания строк добавляют определенные символы-заполнители в начало или конец строки до тех пор, пока строка не достигнет заданной длины.

По умолчанию строка уже выравнена по левому краю, однако это также можно сделать явно с помощью метода str.ljust() (от англ. left justify – выравнивать слева) который добавляет символы-заполнители в конец строки.

Метод

str.ljust(width, fillchar=" ")

Описание

Выравнивает строку str по левому краю до длины width с помощью добавления символа fillchar в конец строки

Параметры

  • width – желаемая длина строки

Необязательные параметры:

  • fillchar – символ-заполнитель, по умолчанию fillchar=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

По правому краю строку выравнивает метод str.rjust() (от англ. right justify – выравнивать справа), добавляющий символы-заполнители в начало строки.

Методы str.ljust() и str.rjust() отличаются префиксами «l» и «r», обозначающими по какому краю выравнивается строка.

Метод

str.rjust(width, fillchar=" ")

Описание

Выравнивает строку str по правому краю до длины width с помощью добавления символа fillchar в начало строки

Параметры

  • width – желаемая длина строки

Необязательные параметры:

  • fillchar – символ-заполнитель, по умолчанию fillchar=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

По центру строку выравнивает метод str.center(), который добавляет символы-заполнители в начало и конец строки.

Метод

str.center(width, fillchar=" ")

Описание

Выравнивает строку str по центру до длины width с помощью добавления символа fillchar в начало и конец строки

Параметры

  • width – желаемая длина строки

Необязательные параметры:

  • fillchar – символ-заполнитель, по умолчанию fillchar=" " (пробел)

Возвращаемое значение

Преобразованная копия строки

Используя методы выравнивания строк, создадим простую таблицу с данными об играх:

  • Столбец "Название" сделаем шириной 20 символов и выровняем по левому краю.
  • Столбец "Год выхода" ограничим до ширины 15 символов и выровняем по центру.
  • Столбец "Жанр" сделаем шириной 20 символов и выровняем по правому краю.
# Создаём заголовки
title = "Название".ljust(20, "-")
year = "Год выхода".center(15, "-")
genre = "Жанр".rjust(20, "-")

# Создаём ячейки первой строки
game1_title = "Марио".ljust(20, "-")
game1_year = "1985".center(15, "-")
game1_genre = "Платформер".rjust(20, "-")

# Построчно выводим на экран
print(f"{title}|{year}|{genre}")
print(f"{game1_title}|{game1_year}|{game1_genre}")

Тогда на экран будет выведена следующая таблица:

Название------------|---Год выхода--|----------------Жанр
Марио---------------|------1985-----|----------Платформер

Так, используя только строки и методы их выравнивания, мы создали простую и наглядную таблицу.

Также метод str.rjust() полезен для выравнивания чисел путём добавления ведущих нулей:

print("23".rjust(5, "0"))
# Вывод: 00023

Однако для этой цели существует более специализированный метод – str.zfill(width) (от англ. zero fill – заполнить нулями), который дополняет строку ведущими нулями до указанной длины.

Метод

str.zfill(width)

Описание

Выравнивает строку str по правому краю до длины width с помощью добавления нулей в начало строки

Параметры

  • width – желаемая длина строки

Возвращаемое значение

Преобразованная копия строки

Добавление ведущих нулей используется для приведения чисел к единому формату. Например, если данные представляют собой шестизначные числа, но некоторые числа имеют меньше цифр, то дополнение их нулями делает информацию более удобной для восприятия:

print("-791".zfill(6))
# Вывод: -000791

Примеры

Пример 1. Нормализация пользовательского ввода команд

Пользователь может вводить команды в разных регистрах или с лишними пробелами. Программа должна обрабатывать команду «выход» независимо от того, как её написал пользователь:

command = input("Введите команду: ")
normalized_command = command.strip().lower()
if normalized_command == "выход":
    print(f"Завершение работы")
else:
    print(f"Команда '{command}' не распознана")

Вывод:

Введите команду:     ВыХОД  
Завершение работы

Пример 2. Создание отчёта о наличии товаров на складе

Программа выводит на экран отчёт о наличии товаров на складе с колонками фиксированной ширины:

# Исходные данные
sales = [
    ("Ноутбук", 15, 45000),
    ("Монитор", 8, 12000),
    ("Клавиатура", 23, 1500)
]
 
# Создаём заголовки
item_title = "Товар".ljust(15)
count_title = "Кол-во".center(10)
price_title = "Цена".rjust(10)
print(item_title + count_title + price_title)
print("-" * 35)
 
# Заполняем таблицу 
for sale in sales:
    item = sale[0].ljust(15)
    count = str(sale[1]).zfill(3).center(10)
    price =  f"{sale[2]}".rjust(10)
    print(item + count + price)

Вывод:

Товар            Кол-во        Цена
-----------------------------------
Ноутбук           015         45000
Монитор           008         12000
Клавиатура        023          1500

Пример 3. Генератор логинов из ФИО

Программа создаёт логин сотрудника в формате «фамилия_инициалы» на основе полного имени:

full_name = "Ковалевская Софья Васильевна"
 
# Разделяем ФИО на части
parts = full_name.split()
 
# Формируем логин: фамилия + первая буква имени + отчества
login = f"{parts[0]}_{parts[1][0]}{parts[2][0]}".lower()
print(f"Логин сотрудника: {login}")

Вывод:

Логин сотрудника: ковалевская_св

Итоги

Методы преобразования и выравнивания строк

Метод

Описание

str.lower()

Приводит все буквы строки str к нижнему регистру

str.upper()

Приводит все буквы строки str к верхнему регистру

str.capitalize()

Приводит первую букву строки str к верхнему регистру, а все остальные – к нижнему

str.title()

Приводит первую букву каждого слова строки str к верхнему регистру, а остальные – к нижнему

str.strip(chars=" ")

Удаляет в начале и конце строки str символы chars

str.lstrip(chars=" ")

Удаляет в начале строки str символы chars

str.rstrip(chars=" ")

Удаляет в конце строки str символы chars

str.replace(old, new, count=-1)

Заменяет все вхождения подстроки old на подстроку new в строке str

str.split(sep=" ", maxsplit=-1)

Разделяет строку str на список подстрок, используя в качестве разделителя строку sep

str.join(iterable)

Объединяет элементы итерируемого объекта iterable в строку, разделяя их строкой str

str.center(width, fillchar=" ")

Выравнивает строку str по центру до длины width с помощью добавления символа fillchar в начало и конец строки

str.ljust(width, fillchar=" ")

Выравнивает строку str по левому краю до длины width с помощью добавления символа fillchar в конец строки

str.rjust(width, fillchar=" ")

Выравнивает строку str по правому краю до длины width с помощью добавления символа fillchar в начало строки

str.zfill(width)

Выравнивает строку str по правому краю до длины width с помощью добавления нулей в начало строки

Задания для самопроверки

1. Почему методы преобразования строк в Python возвращают новую строку, а не изменяют исходную?

Строки в Python являются неизменяемым типом данных. Поэтому методы, которые преобразуют строку, создают и возвращают новую измененную копию, оставляя исходную строку без изменений.

2. Запросите у пользователя строку s и символ sep для разбиения этой строки на список. Разбейте строку s на список по разделителю sep и выведите этот список на экран.

Пример входных данных

Пример выходных данных

мука,молоко,яйца

,

['мука', 'молоко', 'яйца']

яблони_и_груши

_и_

['яблони', 'груши']

рыба*или*курица

*

['рыба', 'или', 'курица']

s = input("Введите строку для преобразования в список: ")
sep = input("Введите разделитель: ")
lst = text.split(separator)
print(lst)

3. Выведите на экран строку "Привет, друг!", выровненную по центру до длины 20 символов символом "-".

message = "Привет, друг!"
print(message.center(20, "-"))  
# Вывод: ----Привет, друг----

4. Как удалить лишние пробелы и символ "№" в начале и конце строки " Заказ №298 №№№"? Каким бы методом вы воспользовались для удаления пробелов только в начале строки?

order = "    Заказ №298 №№№"
print(order.strip(" №"))
# Вывод: Заказ №298

Нужно использовать метод str.strip(). Однако для удаления лишних символов только в начале строки достаточно метода str.lstrip():

order = "    Заказ №298 №№№"
print(order.lstrip(" №"))
# Вывод: Заказ №298 №№№

5. Запросите у пользователя строку. Если пользователь написал "да" в любом регистре, то выведите на экран строку "Продолжение работы", а если "нет", то – "Завершение работы". Если пользователь ввёл строку, отличную от ответа "да" или "нет", то выведите на экран строку "Команда не распознана".

Пример входных данных

Пример выходных данных

дА

Продолжение работы

НЕТ

Завершение работы

Не зНаЮ

Команда не распознана

answer = input("Хотите продолжить? (да/нет): ").lower()

if answer == "да":
    print("Продолжение работы")
elif answer == "нет":
    print("Завершение работы")
else:
    print("Команда не распознана")