Неизменяемость строк
В Python строки относятся к неизменяемым (immutable) типам данных. Это означает, что после создания строки нельзя изменить её содержимое: ни отдельный символ, ни длину, ни регистр.
text = "hello"
# text[0] = "H" # TypeError: 'str' object does not support item assignment
new_text = text.capitalize()
print(text) # hello
print(new_text) # Hello
Любой строковый метод возвращает новую строку. Чтобы сохранить результат, нужно присвоить его переменной:
text = " hello "
text.strip()
print(text) # " hello " — исходная строка не изменилась
cleaned = text.strip()
print(cleaned) # "hello"
Группы методов строк
1. Изменение регистра
Методы возвращают новую строку с преобразованным регистром символов.
text = "Hello, worlD!"
print(text.upper()) # HELLO, WORLD!
print(text.lower()) # hello, world!
print(text.capitalize()) # Hello, world!
print(text.title()) # Hello, World!
print(text.swapcase()) # hELLO, WORLd!
Метод casefold() похож на lower(), но агрессивнее: он учитывает особенности разных языков, например, немецкое ß.
print("Straße".casefold()) # strasse
print("Straße".lower()) # straße
str.casefold() выходит за рамки исходного занятия. Он используется для надёжного сравнения строк без учёта регистра, особенно в многоязычных текстах.
2. Поиск подстроки
Методы find() и index() ищут первое вхождение подстроки и возвращают его индекс. Разница в поведении при отсутствии подстроки:
find()возвращает-1;index()вызывает исключениеValueError.
У каждого метода есть «обратная» версия: rfind() и rindex() ищут последнее вхождение.
text = "Python is awesome. Python is dynamic."
print(text.find("Python")) # 0
print(text.rfind("Python")) # 22
print(text.find("Java")) # -1
print(text.index("Python")) # 0
print(text.rindex("Python")) # 22
# print(text.index("Java")) # ValueError: substring not found
print(text.count("Python")) # 2
print(text.count("Java")) # 0
3. Замена подстрок
Метод replace(old, new, count=-1) заменяет все вхождения old на new. Если задать count, заменяются только первые count вхождений.
text = "I love Python, Python is great"
print(text.replace("Python", "Java"))
# I love Java, Java is great
fruits = "apple apple apple"
print(fruits.replace("apple", "orange", 1))
# orange apple apple
4. Разделение и объединение строк
split() разбивает строку на список подстрок. Без аргументов он разделяет по любым пробельным символам и игнорирует пустые фрагменты. Если явно указать разделитель, например " ", пустые строки сохраняются.
text = "apple banana\t cherry\n"
print(text.split()) # ['apple', 'banana', 'cherry']
print(text.split(" ")) # ['apple', '', '', '', '', 'banana\t', 'cherry\n']
csv = "apple,banana,cherry"
print(csv.split(",")) # ['apple', 'banana', 'cherry']
long = "apple---banana---cherry"
print(long.split("---", 1)) # ['apple', 'banana---cherry']
join() выполняет обратную операцию: объединяет элементы последовательности в одну строку, вставляя между ними строку-разделитель.
fruits = ["apple", "banana", "cherry"]
print(" ".join(fruits)) # apple banana cherry
print(", ".join(fruits)) # apple, banana, cherry
letters = ["a", "b", "c", "d", "e"]
print("".join(letters)) # abcde
rsplit() и splitlines() выходят за рамки исходного занятия. rsplit() разбивает строку справа, а splitlines() — по символам перевода строки.
5. Удаление символов с краёв
Методы strip(), lstrip() и rstrip() удаляют символы с обеих сторон, только слева или только справа соответственно. По умолчанию удаляются пробельные символы; можно передать строку с символами, которые нужно удалить.
text = "\t hello world\n "
print(text.strip()) # hello world
stars = "***hello***"
print(stars.strip("*")) # hello
mixed = "**--*hello---***"
print(mixed.strip("*-")) # hello
left = " hello world "
print(left.lstrip()) # hello world
print(left.rstrip()) # hello world
6. Предикатные методы
Предикаты возвращают True или False в зависимости от содержимого строки.
print("Hello".isalpha()) # True
print("Python3".isalpha()) # False
print("12345".isdigit()) # True
print("12345.1".isdigit()) # False
print("Hello123".isalnum()) # True
print(" ".isspace()) # True
print("hello".islower()) # True
print("HELLO".isupper()) # True
print("Hello World".istitle()) # True
print("Hello World".startswith("Hello")) # True
print("Hello World!".endswith("world")) # False (регистр важен)
Более специфичные предикаты:
print("12345²".isdecimal()) # False
print("12345".isdecimal()) # True
print("½".isnumeric()) # True
print("Привет".isascii()) # False
print("Hello\nWorld".isprintable()) # False
print("_variable".isidentifier()) # True
print("1variable".isidentifier()) # False
7. Выравнивание и заполнение
Методы center(), ljust(), rjust() и zfill() позволяют выравнивать строку и дополнять её символами до нужной ширины.
text = "hi"
print(text.center(10)) # " hi "
print(text.ljust(10, "-")) # "hi--------"
print(text.rjust(10, ".")) # "........hi"
print("42".zfill(5)) # "00042"
print("-5".zfill(5)) # "-0005"
center(), ljust(), rjust() и zfill() выходят за рамки исходного занятия, но входят в стандартную библиотеку Python.
Современные практики
Для форматирования строк удобнее использовать f-strings вместо конкатенации. Для проверки начала и конца строки — startswith()/endswith() вместо срезов. Для безопасного поиска — find() вместо index(), если подстрока может отсутствовать.
name = "Python"
version = 3
print(f"Язык: {name}, версия: {version}")
text = "data_report_2025.csv"
if text.startswith("data_") and text.endswith(".csv"):
print("Это CSV-отчёт")
position = text.find("_2025")
if position != -1:
print(f"Найдено на позиции {position}")