📖 Теория: методы строк

⚡ Кратко

Урок знакомит с методами строк — встроенными функциями для работы с текстом.

  • Строки неизменяемы: методы не меняют исходную строку, а возвращают новую.
  • Регистр: upper(), lower(), title(), capitalize(), swapcase().
  • Поиск: find(), rfind(), index(), rindex(), count().
  • Замена: replace(). Разделение и склейка: split(), rsplit(), splitlines(), join().
  • Очистка краёв: strip(), lstrip(), rstrip().
  • Проверки: isalpha(), isdigit(), isalnum(), isspace(), istitle(), islower(), isupper(), startswith(), endswith().
text = "Python"
print(text.lower())  # python
print(text)          # Python — исходная строка не изменилась

Неизменяемость строк

В Python строки относятся к неизменяемым (immutable) типам данных. Это означает, что после создания строки нельзя изменить её содержимое: ни отдельный символ, ни длину, ни регистр.

📄 examples/immutable_string.py
text = "hello"
# text[0] = "H"  # TypeError: 'str' object does not support item assignment

new_text = text.capitalize()
print(text)      # hello
print(new_text)  # Hello

Любой строковый метод возвращает новую строку. Чтобы сохранить результат, нужно присвоить его переменной:

📄 examples/method_return.py
text = "  hello  "
text.strip()
print(text)  # "  hello  " — исходная строка не изменилась

cleaned = text.strip()
print(cleaned)  # "hello"

Группы методов строк

1. Изменение регистра

Методы возвращают новую строку с преобразованным регистром символов.

📄 examples/case_methods.py
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(), но агрессивнее: он учитывает особенности разных языков, например, немецкое ß.

📄 examples/casefold.py
print("Straße".casefold())  # strasse
print("Straße".lower())     # straße
Проверить по документации: str.casefold() выходит за рамки исходного занятия. Он используется для надёжного сравнения строк без учёта регистра, особенно в многоязычных текстах.

Методы find() и index() ищут первое вхождение подстроки и возвращают его индекс. Разница в поведении при отсутствии подстроки:

  • find() возвращает -1;
  • index() вызывает исключение ValueError.

У каждого метода есть «обратная» версия: rfind() и rindex() ищут последнее вхождение.

📄 examples/find_index.py
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 вхождений.

📄 examples/replace.py
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() разбивает строку на список подстрок. Без аргументов он разделяет по любым пробельным символам и игнорирует пустые фрагменты. Если явно указать разделитель, например " ", пустые строки сохраняются.

📄 examples/split.py
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() выполняет обратную операцию: объединяет элементы последовательности в одну строку, вставляя между ними строку-разделитель.

📄 examples/join.py
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() удаляют символы с обеих сторон, только слева или только справа соответственно. По умолчанию удаляются пробельные символы; можно передать строку с символами, которые нужно удалить.

📄 examples/strip.py
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 в зависимости от содержимого строки.

📄 examples/predicates.py
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 (регистр важен)

Более специфичные предикаты:

📄 examples/extra_predicates.py
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() позволяют выравнивать строку и дополнять её символами до нужной ширины.

📄 examples/alignment.py
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(), если подстрока может отсутствовать.

📄 examples/modern_fstring_search.py
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}")
Проверить по документации: f-strings выходят за рамки исходного занятия. Они описаны в официальной документации Python и в материалах Real Python (см. Ресурсы).