Чтобы перевести строку в нижний регистр в Python, вызовите у неё метод lower(): "Привет, Мир".lower() вернёт "привет, мир". Метод работает без аргументов и меняет только буквы, а цифры, пробелы и знаки препинания оставляет как были. Исходная строка при этом не меняется: lower() возвращает новую строку, и её нужно сохранить в переменную.
text = "Привет, Мир! Python 3.14"
small = text.lower()
print(small)
print(text)
привет, мир! python 3.14
Привет, Мир! Python 3.14
Ниже покажу, где lower() нужен в реальном коде, чем он отличается от casefold() и на каких ошибках новички теряют время. Остальные методы строк собраны в шпаргалке по методам строк в Python.
Как работает метод lower()

Запись короткая: строка.lower(). Скобки обязательны, внутрь ничего не передаётся. В документации Python метод описан одной фразой: он возвращает копию строки, где все буквы, у которых есть регистр, переведены в нижний.
Копия появляется потому, что строки в Python неизменяемые. Ни один метод строки не правит её «на месте», каждый отдаёт новый объект. Так устроены и replace(), и strip(), и все остальные.
| Что было в строке | Что сделает lower() | Пример |
|---|---|---|
| Заглавные латинские буквы | переведёт в строчные | "PYTHON" → "python" |
| Заглавные русские буквы, включая Ё и Й | переведёт в строчные | "ЁЛКА" → "ёлка" |
| Цифры, пробелы, знаки препинания | оставит без изменений | "3.14!" → "3.14!" |
| Буквы, уже строчные | оставит без изменений | "мир" → "мир" |
Пошагово: как перевести строку в нижний регистр
Возьмём частую задачу. Программа спрашивает «Продолжить?», а человек может ответить «да», «Да», «ДА» или «да» с пробелом в конце. Сравнивать каждый вариант отдельно неудобно, поэтому ответ сначала приводят к одному виду.
- Получите строку, например через
input(). - Уберите пробелы по краям методом
strip(). - Вызовите
lower()на результате. - Сравните с образцом, записанным строчными буквами.
answer = input("Продолжить? (да/нет): ")
if answer.strip().lower() == "да":
print("Продолжаем")
else:
print("Остановились")
Я запустил этот код и ввёл « ДА » с пробелами по краям:
Продолжить? (да/нет): ДА
Продолжаем
Методы в цепочке выполняются слева направо: сначала strip() отдаёт строку без пробелов, потом lower() переводит её в строчные. Порядок здесь не важен, но читать цепочку проще, когда очистка стоит первой. Как устроена сама проверка, подробно разобрано в статье про операторы Python.
Где lower() нужен на практике
Почти всегда lower() вызывают перед сравнением. Компьютер считает «Python» и «python» разными строками, а человеку разница обычно не важна.
Поиск подстроки без учёта регистра
Оператор in ищет точное совпадение, поэтому запрос «PYTHON» в названии «Курс Python для начинающих» он не найдёт. Если перевести в нижний регистр обе стороны, поиск сработает.
title="Курс Python для начинающих"
query = "PYTHON"
print(query in title)
print(query.lower() in title.lower())
False
True
Нижний регистр для всего списка
У списка метода lower() нет, его вызывают у каждого элемента. Удобнее всего это делать генератором списка или функцией map(). Заодно легко убрать дубли, которые отличались только регистром.
tags = ["Python", "SQL", "Excel", "python", "EXCEL"]
small_tags = [tag.lower() for tag in tags]
print(small_tags)
print(sorted(set(small_tags)))
print(list(map(str.lower, tags)))
['python', 'sql', 'excel', 'python', 'excel']
['excel', 'python', 'sql']
['python', 'sql', 'excel', 'python', 'excel']
Если исходные данные пришли одной строкой через запятую, сначала разбейте её на части. Как это сделать, показано в инструкции про перевод строки в список.
Подсчёт слов в тексте
Без lower() слова «Кот», «КОТ» и «кот» попадут в подсчёт тремя разными словами. С ним счётчик сложит их в одно:
from collections import Counter
text = "Кот видит кота. КОТ спит, а кот ест."
words = [w.strip(".,!?") for w in text.lower().split()]
print(Counter(words).most_common(2))
[('кот', 3), ('видит', 1)]
Слово «кота» счётчик посчитал отдельно: lower() меняет регистр, но падежи не склеивает. Для подсчёта одного символа или слова хватит встроенного метода, о нём отдельная статья про count() в Python.
Очистка адреса почты
Люди вводят почту как придётся: с пробелом, с заглавными буквами. Перед сохранением в базу её обычно нормализуют, чтобы «Ivan.Petrov@Mail.RU» и «ivan.petrov@mail.ru» не стали двумя разными пользователями.
email = " Ivan.Petrov@Mail.RU "
clean = email.strip().lower()
print(clean)
ivan.petrov@mail.ru
Есть тонкость. По стандарту RFC 5321 регистр в домене после «@» значения не имеет, а часть до «@» почтовый сервер обязан считать чувствительной к регистру: на некоторых серверах smith и Smith считаются разными ящиками. Сам стандарт пользоваться этим не советует. Поэтому во многих системах адрес хранят как ввёл человек, а нижний регистр применяют только при поиске и сравнении.
Ключи словаря в нижнем регистре
Когда ключи словаря собирают из разных источников, «Python» и «python» легко оказываются двумя ключами. Значения при этом делятся между ними, и итог по каждому выходит неверным. Если приводить ключ к нижнему регистру перед записью, значения сложатся в один ключ:
prices = {"Python": 5, "SQL": 3, "python": 2}
merged = {}
for key, value in prices.items():
small = key.lower()
merged[small] = merged.get(small, 0) + value
print(merged)
{'python': 7, 'sql': 3}
Как перевести в нижний регистр только часть строки
Метод lower() всегда обрабатывает строку целиком. Аргумента «только первые три буквы» у него нет. Если нужна часть, вырежьте её срезом, переведите и склейте с остатком.
word = "Python"
print(word[:1].lower() + word[1:])
phrase = "КУРСЫ по Python"
print(phrase[:5].lower() + phrase[5:])
python
курсы по Python
Запись word[:1] берёт первый символ, а word[1:] всё остальное. Срез [:1] удобнее индекса [0]: на пустой строке он вернёт пустую строку, а индекс упадёт с ошибкой IndexError. Как устроены срезы, подробно разобрано в статье про срезы в Python.
lower(), casefold() и другие методы регистра

У строки есть ещё несколько методов, которые работают с регистром. Их часто путают, поэтому прогнал все на одной фразе «Hello World»:
| Метод | Что делает | Результат для «Hello World» |
|---|---|---|
lower() |
все буквы строчные | hello world |
upper() |
все буквы заглавные | HELLO WORLD |
capitalize() |
первая буква строки заглавная, остальные строчные | Hello world |
title() |
каждое слово с заглавной | Hello World |
swapcase() |
меняет регистр каждой буквы на противоположный | hELLO wORLD |
casefold() |
убирает различия регистра для сравнения | hello world |
Проверить, что строка уже в нижнем регистре, можно методом islower(). Он возвращает True, если в строке есть хотя бы одна буква и все буквы строчные.
Чем casefold() отличается от lower()
Для русского и английского текста оба метода дают одинаковый результат. Разница появляется на редких символах. Пример из документации casefold(): немецкая «ß» уже строчная, поэтому lower() её не трогает, а casefold() заменяет на «ss».
print("straße".lower())
print("straße".casefold())
print("STRASSE".lower() == "straße".lower())
print("STRASSE".casefold() == "straße".casefold())
straße
strasse
False
True
Правило я вывел такое: lower() для вывода и хранения, casefold() для сравнения, если в данных может встретиться что-то кроме кириллицы и латиницы. Метод casefold() есть в Python начиная с версии 3.3.
Русские буквы и другие алфавиты
Python 3 хранит строки в Unicode, поэтому lower() одинаково переводит в строчные латиницу, кириллицу и греческий. Буквы Ё и Й переходят в ё и й без потерь.
print("ЁЛКА И ЙОД".lower())
print("ΟΔΟΣ".lower())
print("İstanbul".lower())
print(len("İ"), len("İ".lower()))
ёлка и йод
οδος
i̇stanbul
1 2
В греческом слове последняя сигма стала конечной «ς», как и требует правописание. По документации Python, lower() переводит буквы по разделу 3.13.2 «Default Case Conversion» стандарта Unicode.
С турецкой «İ» (заглавная I с точкой) вышло иначе: после lower() получилось два символа, обычная «i» и отдельная точка сверху. Поэтому длина строки выросла с 1 до 2. Правил отдельных языков lower() не учитывает, поэтому для турецкого и азербайджанского текста результат выходит не тот, которого ждёт носитель.
Частые ошибки и что с ними делать

Ниже пять ошибок, которые я встречаю в коде новичков чаще остальных. Каждую прогнал в Python 3.14, вывод скопирован из терминала.
Вызвали lower() и не сохранили результат
Строка не изменилась, хотя метод вызван. Причина в неизменяемости: результат lower() создаётся и сразу пропадает.
name = "Анна"
name.lower()
print(name)
name = name.lower()
print(name)
Анна
анна
Решение: присвойте результат переменной, той же или новой.
Забыли скобки
Запись word.lower без скобок не вызывает метод, а отдаёт сам метод как объект. Ошибки не будет, но сравнение молча вернёт False.
word = "Да"
print(word.lower == "да")
print(word.lower() == "да")
False
True
Вызвали lower() у числа или None
Метод есть только у строк. У числа Python выдаст AttributeError: 'int' object has no attribute 'lower', у пустого значения AttributeError: 'NoneType' object has no attribute 'lower'. Чаще всего это случается, когда данные пришли из файла или формы и в поле оказалось пусто.
Решение: проверьте значение перед вызовом или подставьте пустую строку: (value or "").lower(). Вариант str(value).lower() опасен: для None он вернёт строку «none», и она попадёт в данные как обычное слово.
Вызвали lower() у списка
Ошибка AttributeError: 'list' object has no attribute 'lower' значит, что метод вызвали у списка целиком. Переведите элементы по одному через генератор списка, как в примере с тегами выше.
Ждали True от islower() для строки без букв
Строка из одних цифр не считается строкой в нижнем регистре, потому что в ней нет букв.
print("123".islower())
print("abc123".islower())
False
True
Если нужно проверить «в строке нет заглавных», сравнивайте её с собственной копией: s == s.lower(). Для «123» такое сравнение вернёт True.
Где освоить Python системно
Методы строк обычно проходят в первые две недели любого курса по Python. Дальше идут функции, работа с файлами и библиотеки, а там уже нужна практика с проверкой кода. В каталоге Checkroi курсы Python можно сравнить по цене, длительности и отзывам учеников. Пять программ оттуда:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 754 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 3890 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




