lower() в Python: строчные буквы и сравнение без регистра
Метод lower в Python возвращает копию строки, в которой все заглавные буквы заменены строчными, а цифры, пробелы и знаки препинания остаются без изменений. Чаще всего его применяют для сравнения строк без учета регистра, обработки ввода пользователя и очистки данных. Ниже показан синтаксис, родственные методы casefold(), upper() и title(), работа со списками и типичные ошибки.

Содержание статьи
Синтаксис и результат
Метод вызывается у строки через точку и не принимает аргументов. Он работает с любым алфавитом, который поддерживает Unicode, включая кириллицу.
text = "Привет, МИР! Python 3.12"
print(text.lower()) # привет, мир! python 3.12
print(text) # Привет, МИР! Python 3.12Вторая строка вывода показывает важное свойство: исходная строка не меняется. Строки в Python неизменяемые, поэтому lower() всегда создает новый объект. Чтобы сохранить результат, его присваивают переменной: text = text.lower().
Если вызвать метод у объекта другого типа, например у числа или None, получится AttributeError. В таких случаях значение сначала приводят к строке: str(value).lower().
Сравнение строк без учета регистра
Оператор == различает регистр: "Да" == "да" дает False. Если привести обе строки к одному регистру, сравнение будет учитывать только буквы.
answer = input("Продолжить? (да/нет): ").strip().lower()
if answer in ("да", "д", "yes", "y"):
print("Продолжаем")
else:
print("Выход")Сочетание strip() и lower() убирает пробелы по краям и регистр, поэтому ответы " ДА ", "Да" и "да" обработаются одинаково. Подробнее о методе удаления пробелов рассказано в статье strip в Python.
Этот же прием работает для поиска подстроки без учета регистра:
title = "Уроки PYTHON для начинающих"
print("python" in title.lower()) # Truelower() и casefold()
Для большинства языков, включая русский и английский, оба метода дают одинаковый результат. Разница проявляется в символах, у которых нет простой пары в нижнем регистре. Самый известный пример - немецкая буква ß: она уже строчная, поэтому lower() ее не трогает, а casefold() заменяет на "ss".
word = "Straße"
print(word.lower()) # straße
print(word.casefold()) # strasse
print("STRASSE".lower() == word.lower()) # False
print("STRASSE".casefold() == word.casefold()) # TrueПравило выбора: для отображения текста пользователю используйте lower(), а для сравнения строк, где могут встретиться символы разных языков, надежнее casefold(). Метод доступен с Python 3.3.
Другие методы для работы с регистром
У строк есть целое семейство методов для изменения регистра и его проверки. Все они возвращают новую строку или логическое значение.
| Метод | Что делает | "пРИВЕТ мир" |
|---|---|---|
lower() | все буквы строчные | привет мир |
upper() | все буквы заглавные | ПРИВЕТ МИР |
capitalize() | первая буква заглавная, остальные строчные | Привет мир |
title() | каждое слово с заглавной буквы | Привет Мир |
swapcase() | меняет регистр на противоположный | Привет МИР |
casefold() | агрессивное приведение для сравнения | привет мир |
islower() | True, если все буквы строчные | False |
isupper() | True, если все буквы заглавные | False |
Метод islower() смотрит только на буквы: "abc123".islower() вернет True, а строка без букв, например "123", даст False. Полный список методов с примерами собран на странице методы строк Python.
Нижний регистр для списков и словарей
Метод работает только со строкой, у списка его нет. Чтобы привести к нижнему регистру все элементы, используют генератор списка или map().
tags = ["Python", "SQL", "Flask"]
print([t.lower() for t in tags]) # ['python', 'sql', 'flask']
print(list(map(str.lower, tags))) # тот же результат
users = {"Anna": 5, "OLEG": 3}
print({k.lower(): v for k, v in users.items()}) # {'anna': 5, 'oleg': 3}Если после приведения к одному регистру нужно убрать повторы, удобно сразу собрать множество: {t.lower() for t in tags}. В таблицах pandas для столбца со строками есть векторный вариант: df["city"].str.lower().
Первая буква в нижнем регистре
Отдельного метода, который делает строчной только первую букву, нет. Задачу решают срезом: первый символ переводят в нижний регистр и приклеивают остаток строки.
name = "ProductName"
print(name[:1].lower() + name[1:]) # productNameСрез [:1] не вызывает ошибку на пустой строке, в отличие от обращения по индексу [0]. Больше приемов со срезами есть в статье срезы в Python.
Частые ошибки
- Вызов без присваивания:
s.lower()на отдельной строке ничего не меняет, результат теряется. - Вызов без скобок:
s.lowerвозвращает сам метод, а не строку, и сравнение с текстом всегда даетFalse. - Попытка вызвать у списка:
["A"].lower()даетAttributeError: 'list' object has no attribute 'lower'. - Приведение к регистру внутри цикла при каждой проверке. Если сравнение идет много раз, переведите эталонные строки в нижний регистр один раз заранее.
Описание всех строковых методов приведено в документации Python.
Частые вопросы
Ответы на вопросы, которые задают о методе lower().
Работает ли lower() с русскими буквами?
Да. Строки в Python 3 хранятся в Unicode, поэтому кириллица, буква Ё и другие алфавиты переводятся в нижний регистр без дополнительных настроек.
Есть ли lower() у байтовых строк?
Есть, но bytes.lower() меняет только латинские буквы A-Z. Русский текст в байтах сначала декодируют в строку методом decode().
Как проверить, что в строке нет заглавных букв?
Сравните строку с ее версией в нижнем регистре: s == s.lower(). Это работает и для строк без букв, в отличие от islower().
Чем lower() отличается от upper()?
Методы делают противоположное: lower() переводит буквы в строчные, upper() в заглавные. Синтаксис и поведение с цифрами и символами у них одинаковые.