Методы строк в Python: изменение регистра
Обновлено:
Строки в Python являются неизменяемыми объектами.
Это означает, что строковый метод не изменяет существующую строку. Он возвращает строку с результатом своей работы.
Например:
text = 'Hello Python'
result = text.upper()
print(text)
print(result)
Результат:
Hello Python
HELLO PYTHON
Исходная строка осталась прежней:
text
А результат метода мы можем:
result = text.upper()
сохранить в новую переменную, переназначить старое имя:
text = text.upper()
или сразу передать дальше:
print(text.upper())
Для неизменяемых объектов не следует строить логику программы на предположении, что результат метода обязательно имеет другой id. Важно именно то, что исходную строку строковые методы не изменяют.
upper()
1. Перевод строки в верхний регистр
Метод:
upper()
переводит регистровые символы строки в верхний регистр.
language = 'Python'
result = language.upper()
print(result)
Результат:
PYTHON
Другой пример:
message = 'Hello world 2026!'
print(message.upper())
Результат:
HELLO WORLD 2026!
Цифры, пробелы и большинство знаков пунктуации собственного верхнего или нижнего регистра не имеют, поэтому остаются без изменений.
AttributeError
2. Обращение к несуществующему методу
Предположим, мы допустили опечатку:
text = 'Python'
text.uper()
У объектов класса str нет метода:
uper
Поэтому возникает новое для нас исключение:
AttributeError
Сообщение будет примерно таким:
AttributeError: 'str' object has no attribute 'uper'
AttributeError возникает, когда программа обращается к атрибуту объекта, которого у этого объекта нет.
Методы тоже являются атрибутами, поэтому опечатка в названии метода часто приводит именно к AttributeError.
3. NameError и AttributeError
Сравним.
print(user_name)
Если имя:
user_name
нигде не найдено, возникает:
NameError
Но здесь:
text = 'Python'
text.unknown_method()
объект text существует.
Python не находит уже атрибут этого объекта:
unknown_method
поэтому возникает:
AttributeError
Упрощённо:
NameError → не найдено имя
AttributeError → у объекта не найден нужный атрибут
lower()
4. Перевод строки в нижний регистр
Метод:
lower()
переводит регистровые символы строки в нижний регистр.
language = 'PYTHON'
result = language.lower()
print(result)
Результат:
python
Например:
email = 'USER@EXAMPLE.COM'
print(email.lower())
Результат:
user@example.com
Исходная строка при этом не изменяется.
Сравнение строк без учёта регистра
5. Практический алгоритм
Рассмотрим две строки:
first_login = 'PythonDeveloper'
second_login = 'PYTHONDEVELOPER'
Обычное сравнение:
print(first_login == second_login)
даст:
False
Потому что регистр символов отличается.
Если в нашей задаче регистр не имеет значения, можно сначала привести обе строки к одному регистру:
result = (
first_login.lower()
== second_login.lower()
)
print(result)
Результат:
True
Этот подход часто используется, когда необходимо сравнивать введённые пользователем строки без учёта регистра.
Например:
expected_answer = 'Python'
user_answer = 'PYTHON'
is_correct = (
user_answer.lower()
== expected_answer.lower()
)
print(is_correct)
Результат:
True
casefold()
6. Более глубокое сравнение без учёта регистра
Для обычного преобразования текста в нижний регистр используется:
lower()
Но для регистронезависимого сравнения Unicode-строк существует специальный метод:
casefold()
Он похож на lower(), но выполняет более агрессивное преобразование некоторых Unicode-символов, чтобы привести их к форме, удобной именно для сравнения без учёта регистра.
Простой пример:
text = 'PYTHON'
print(text.lower())
print(text.casefold())
Результат одинаковый:
python
python
Для большинства обычных латинских и кириллических строк разницы действительно не будет.
7. Где lower() и casefold() различаются
Хороший пример — немецкая буква:
ß
Посмотрим:
text = 'Straße'
print(text.lower())
print(text.casefold())
Результат:
straße
strasse
lower() оставляет:
ß
а casefold() приводит её к:
ss
8. Практическая разница при сравнении
first_text = 'Straße'
second_text = 'STRASSE'
print(
first_text.lower()
== second_text.lower()
)
Результат:
False
А:
print(
first_text.casefold()
== second_text.casefold()
)
Результат:
True
Поэтому для полноценного сравнения пользовательского Unicode-текста без учёта регистра обычно лучше подходит:
casefold()
9. Ещё несколько преобразований casefold()
Например:
print('ß'.casefold())
Результат:
ss
Некоторые лигатуры также могут быть развёрнуты:
print('ff'.casefold())
Результат:
ff
У греческой сигмы существуют разные формы:
σ
ς
Для регистронезависимого сравнения casefold() приводит их к общей форме:
print('σ'.casefold())
print('ς'.casefold())
Результат:
σ
σ
10. Когда lower(), а когда casefold()
Если наша задача:
просто получить текст в нижнем регистре,
используем:
lower()
Например:
title = 'PYTHON BACKEND'
normalized_title = title.lower()
Если задача:
сравнить пользовательские Unicode-строки без учёта регистра,
предпочтительнее:
casefold()
Например:
first_name = 'Straße'
second_name = 'STRASSE'
is_equal = (
first_name.casefold()
== second_name.casefold()
)
То есть методы похожи, но предназначение у них немного разное:
lower() → получить нижний регистр
casefold() → подготовить текст к более надёжному сравнению без учёта регистра
title()
11. Простой пример
Метод:
title()
возвращает строку в так называемом title case.
text = 'hello world'
print(text.title())
Результат:
Hello World
Начальные буквы слов переводятся в верхний регистр, остальные регистровые символы внутри этих слов — в нижний.
12. Границы слов в title()
title() работает не только с обычными пробелами.
Например:
text = (
'hello-world_python.'
'sql2server\\api'
)
print(text.title())
Результат:
Hello-World_Python.Sql2Server\Api
Посмотрим на отдельные участки:
hello-world → Hello-World
world_python → World_Python
python.sql → Python.Sql
sql2server → Sql2Server
server\api → Server\Api
Символы вроде:
-
_
.
цифр
\
разделяют последовательности букв, поэтому следующая буквенная часть снова начинается в верхнем регистре.
13. Особенность title()
Рассмотрим:
text = "they're developers"
print(text.title())
Получим:
They'Re Developers
Апостроф тоже воспринимается как граница между буквенными последовательностями.
Поэтому title() не является полноценным инструментом для грамматически правильного оформления названий на всех естественных языках.
Он применяет правила регистра Python, а не понимает смысл предложения.
capitalize()
14. Первая часть строки в верхнем регистре
Метод:
capitalize()
работает проще.
text = 'hello WORLD'
print(text.capitalize())
Результат:
Hello world
Первая регистровая позиция строки приводится к заглавной форме, а остальные регистровые символы строки переводятся в нижний регистр.
Для обычной строки:
'python DEVELOPER'.capitalize()
получим:
Python developer
15. Если строка начинается не с буквы
text = '123HELLO WORLD'
print(text.capitalize())
Результат:
123hello world
Цифра под нулевым индексом не имеет регистра, поэтому она остаётся прежней.
Но оставшиеся буквы переводятся в нижний регистр.
16. capitalize() работает со всей строкой
text = '''HELLO WORLD
PYTHON BACKEND'''
print(text.capitalize())
Результат:
Hello world
python backend
Метод не начинает заново поднимать регистр после пробела или переноса строки.
title() и capitalize()
17. Разница
Рассмотрим одну строку:
text = 'python BACKEND developer'
title():
print(text.title())
Результат:
Python Backend Developer
capitalize():
print(text.capitalize())
Результат:
Python backend developer
Получаем разные задачи:
title()
→ обрабатывает отдельные буквенные части по всей строке
capitalize()
→ делает заглавной начало всей строки,
остальные буквы приводит к нижнему регистру
18. Когда использовать title()
Например, нам поступило название:
course_name = 'python backend developer'
и нужно получить:
Python Backend Developer
Подходит:
course_name.title()
19. Когда использовать capitalize()
Предположим, в программе мы уже получили отдельное слово:
word = 'pYTHON'
и хотим привести его к виду:
Python
Подходит:
word.capitalize()
Для одного отдельного слова нам не нужна логика поиска нескольких слов внутри строки.
Выбирать между title() и capitalize() следует прежде всего по смыслу задачи. capitalize() решает более простую задачу, но разницу в производительности обычно нет смысла использовать как главный критерий без отдельного измерения.
swapcase()
20. Замена регистра на противоположный
Метод:
swapcase()
меняет регистр символов на противоположный.
text = 'Hello Python'
print(text.swapcase())
Результат:
hELLO pYTHON
То есть:
верхний регистр → нижний
нижний регистр → верхний
21. Ещё один пример
text = 'PyThOn 2026!'
result = text.swapcase()
print(result)
Результат:
pYtHoN 2026!
Цифры, пробелы и знаки пунктуации остаются без изменений.
Главное по первой части
Все рассмотренные методы работают со строкой и возвращают строковый результат, не изменяя исходный объект.
upper()
Переводит регистровые символы в верхний регистр:
text.upper()
'Python' → 'PYTHON'
lower()
Переводит регистровые символы в нижний регистр:
text.lower()
'Python' → 'python'
casefold()
Используется для более полного регистронезависимого сравнения Unicode-строк:
first.casefold() == second.casefold()
Например:
'Straße' → 'strasse'
title()
Приводит буквенные части строки к title case:
text.title()
'hello world' → 'Hello World'
capitalize()
Обрабатывает начало всей строки и приводит оставшиеся регистровые символы к нижнему регистру:
text.capitalize()
'hello WORLD' → 'Hello world'
swapcase()
Меняет регистр на противоположный:
text.swapcase()
'Hello' → 'hELLO'
Если обратиться к несуществующему методу или другому отсутствующему атрибуту объекта:
text.unknown_method()
возникнет:
AttributeError