Методы строк Python
Методы строк Python: strip, split, join, replace, find, upper, lower и другие — с примерами, подводными камнями и советами по применению.
Строки в Python обладают богатым набором встроенных методов, которые охватывают практически любые операции обработки — удаление пробелов, поиск, разбиение, объединение, проверку содержимого и форматирование. Поскольку строки являются неизменяемыми, каждый метод возвращает новую строку (или другое значение), а не изменяет оригинал.
В этой главе рассмотрены наиболее важные методы строк, сгруппированные по назначению, с примерами и типичными подводными камнями. Об основах создания строк и индексировании рассказывается в главе Python Strings. Синтаксис срезов описан в главе Slicing Strings.
Преобразование регистра
upper() и lower()
upper() возвращает копию строки, в которой все буквы переведены в верхний регистр; lower() делает обратное.
Эти методы не учитывают локаль при работе с ASCII-символами. Для корректного преобразования с учётом локали (например, турецкой буквы İ) используйте модуль locale или сторонние библиотеки.
title() и capitalize()
title() делает заглавной первую букву каждого слова. capitalize() делает заглавной только первый символ всей строки, переводя остальные в нижний регистр.
s = "hello world"
print(s.title()) # Hello World
print(s.capitalize()) # Hello worldПодводный камень: title() считает любой не-буквенный символ границей слова, поэтому "it's" превращается в "It'S". Если нужно умное определение границ слов, используйте функцию string.capwords() из стандартной библиотеки.
swapcase()
Инвертирует регистр каждого символа — верхний регистр становится нижним и наоборот.
print("Hello World".swapcase()) # hELLO wORLDПробелы и дополнение
strip(), lstrip() и rstrip()
Эти методы удаляют начальные и/или конечные символы (по умолчанию — пробельные символы).
s = " Hello World "
print(s.strip()) # "Hello World"
print(s.lstrip()) # "Hello World "
print(s.rstrip()) # " Hello World"Можно передать строку символов для удаления — не префикс/суффикс, а любую комбинацию из указанных символов:
print("***hello***".strip("*")) # hello
print("xyzhelloyz".strip("xyz")) # hellocenter(), ljust() и rjust()
Дополняют строку до заданной ширины. Необязательный символ заполнения (по умолчанию — пробел) занимает свободное место.
print("hi".center(10)) # " hi "
print("hi".ljust(10, "-")) # "hi--------"
print("hi".rjust(10, "-")) # "--------hi"Эти методы удобны для построения текстовых таблиц с фиксированной шириной столбцов.
zfill()
Дополняет числовую строку ведущими нулями до заданной ширины. Метод учитывает ведущий знак + или -.
print("42".zfill(5)) # 00042
print("-7".zfill(5)) # -0007Поиск и подсчёт
find() и rfind()
find(sub) возвращает наименьший индекс, по которому найдена подстрока sub, или -1, если подстрока не найдена. rfind(sub) находит наибольший (самый правый) индекс.
s = "Hello World"
print(s.find("World")) # 6
print(s.find("xyz")) # -1
print(s.rfind("l")) # 9Оба метода принимают необязательные аргументы start и end для ограничения диапазона поиска.
index() и rindex()
Работают точно так же, как find() и rfind(), но вызывают ValueError вместо возврата -1, когда подстрока не найдена. Используйте find(), когда отсутствие подстроки является нормальной ситуацией; используйте index(), когда её отсутствие означает ошибку.
s = "Hello World"
print(s.index("World")) # 6
# s.index("xyz") # raises ValueErrorcount()
Возвращает количество непересекающихся вхождений подстроки.
print("banana".count("a")) # 3
print("banana".count("an")) # 2
print("aaaa".count("aa")) # 2 (non-overlapping)startswith() и endswith()
Возвращают True, если строка начинается или заканчивается на указанный префикс/суффикс. Оба метода принимают кортеж строк для одновременной проверки нескольких вариантов.
filename = "report.pdf"
print(filename.startswith("report")) # True
print(filename.endswith(".pdf")) # True
print(filename.endswith((".pdf", ".docx"))) # TrueЭто зачастую нагляднее, чем срез: filename[-4:] == ".pdf".
Замена и разбиение
replace(old, new, count=-1)
Возвращает копию строки, в которой каждое вхождение old заменено на new. Передайте целое число третьим аргументом, чтобы ограничить количество замен.
replace() выполняет точное буквальное совпадение; для замены по шаблону используйте функцию re.sub() из главы Python Regex.
split(sep=None, maxsplit=-1)
Разбивает строку по разделителю sep и возвращает список. Если sep не указан (или равен None), разбиение происходит по любым пробельным символам, а пустые строки отбрасываются — идеально для токенизации пользовательского ввода.
split() всегда возвращает список, даже если разделитель отсутствует (список содержит только исходную строку).
rsplit(sep=None, maxsplit=-1)
Аналогичен split(), но начинает разбиение справа. Удобен, когда нужно получить только последние части строки.
path = "/home/user/documents/file.txt"
print(path.rsplit("/", 1)) # ['/home/user/documents', 'file.txt']splitlines()
Разбивает строку по границам строк (\n, \r\n, \r и другим) и при желании сохраняет символы конца строки.
text = "line one\nline two\r\nline three"
print(text.splitlines()) # ['line one', 'line two', 'line three']join(iterable)
Операция, обратная split(). Объединяет все элементы итерируемого объекта, вставляя между ними строку, для которой вызван метод. Это предпочтительный способ построить строку из списка, так как Python выполняет его за один шаг.
print(", ".join(["apples", "bananas", "cherries"]))
# apples, bananas, cherries
print("".join(["P", "y", "t", "h", "o", "n"]))
# PythonПодробнее см. в главе Concatenate Strings.
Проверка содержимого
Эти методы возвращают True или False и удобны для валидации ввода.
| Метод | Возвращает True, когда… |
|---|---|
isalpha() | Все символы являются буквами |
isdigit() | Все символы являются цифрами (0–9) |
isnumeric() | Все символы являются числовыми (включая ², ½ и т.д.) |
isalnum() | Все символы являются буквами или цифрами |
isspace() | Все символы являются пробельными |
islower() | Все символы с регистром написаны в нижнем регистре |
isupper() | Все символы с регистром написаны в верхнем регистре |
istitle() | Строка оформлена в стиле заголовка |
print("Python".isalpha()) # True
print("12345".isdigit()) # True
print("abc123".isalnum()) # True
print(" ".isspace()) # True
print("Hello World".istitle()) # TrueПримечание: Для пустой строки все эти методы возвращают False.
Длина строки
len() — встроенная функция, а не метод строки, но она является основой работы со строками.
Строки индексируются с нуля, поэтому допустимые индексы — от 0 до len(s) - 1.
Конкатенация
Оператор + объединяет две строки. Оператор * повторяет строку заданное количество раз.
Для объединения большого числа строк или построения строки в цикле "".join(list) значительно быстрее, чем + в цикле. Сравнение производительности см. в главе Concatenate Strings.
Форматирование
format() и f-строки
str.format() подставляет значения в плейсхолдеры {}. F-строки (Python 3.6+) делают то же самое более лаконично и сейчас являются предпочтительным стилем.
name = "Alice"
score = 95
# str.format()
print("Hello, {}! Your score is {}.".format(name, score))
# f-string (preferred)
print(f"Hello, {name}! Your score is {score}.")
# Hello, Alice! Your score is 95.Оба варианта поддерживают спецификаторы формата. Полный синтаксис описан в главе Python String Formatting.
encode()
Преобразует строку в объект bytes с использованием указанной кодировки (по умолчанию utf-8).
s = "café"
print(s.encode("utf-8")) # b'caf\xc3\xa9'
print(s.encode("ascii", errors="replace")) # b'caf?'Краткий справочник
| Метод | Что делает |
|---|---|
s.upper() | Весь текст в верхнем регистре |
s.lower() | Весь текст в нижнем регистре |
s.title() | Стиль заголовка (каждое слово) |
s.capitalize() | Первый символ в верхнем регистре |
s.swapcase() | Инвертировать регистр |
s.strip(chars) | Удалить начальные/конечные символы |
s.lstrip(chars) | Удалить начальные символы |
s.rstrip(chars) | Удалить конечные символы |
s.center(w, fill) | Центрировать в поле шириной w |
s.ljust(w, fill) | Выровнять по левому краю в поле шириной w |
s.rjust(w, fill) | Выровнять по правому краю в поле шириной w |
s.zfill(w) | Дополнить ведущими нулями |
s.find(sub) | Наименьший индекс sub, или -1 |
s.rfind(sub) | Наибольший индекс sub, или -1 |
s.index(sub) | Как find(), но вызывает ValueError |
s.count(sub) | Подсчёт непересекающихся вхождений |
s.startswith(prefix) | True, если строка начинается с префикса |
s.endswith(suffix) | True, если строка заканчивается суффиксом |
s.replace(old, new) | Заменить вхождения |
s.split(sep) | Разбить на список |
s.rsplit(sep) | Разбить справа |
s.splitlines() | Разбить по концам строк |
sep.join(iterable) | Объединить итерируемый объект с разделителем |
s.isalpha() | Все символы — буквы? |
s.isdigit() | Все символы — цифры? |
s.isalnum() | Все символы — буквы или цифры? |
s.isspace() | Все символы — пробельные? |
s.format(...) | Форматирование с плейсхолдерами |
s.encode(enc) | Кодирование в bytes |