Изменение строк
Узнайте, как изменять строки в Python: конкатенация, срезы, методы регистра, replace, strip, split, join и другие. С примерами кода.
Строки в Python — это последовательности символов, заключённые в кавычки. Несмотря на то что строки неизменяемы — их нельзя изменить на месте — Python предоставляет богатый набор операторов и методов, которые возвращают новые изменённые строки. В этой главе рассматриваются важнейшие техники: конкатенация, повторение, преобразование регистра, срезы, замена подстрок, удаление пробелов, разбиение и объединение строк и многое другое.
Ключевая концепция: строки неизменяемы
Прежде чем двигаться дальше, важно понять: каждый метод «изменения» возвращает новую строку. Исходная строка никогда не меняется.
greeting = "hello"
upper_greeting = greeting.upper()
print(greeting) # hello (unchanged)
print(upper_greeting) # HELLO (new string)Это означает, что результат необходимо присвоить переменной (или использовать напрямую), чтобы сохранить изменения.
Конкатенация строк
Конкатенация объединяет две и более строки в одну с помощью оператора +. Можно соединить сколько угодно строк в цепочку.
Конкатенация строк в Python
Конкатенация переменных и литералов
Можно смешивать строковые переменные со строковыми литералами:
first_name = "Ada"
last_name = "Lovelace"
full_name = first_name + " " + last_name
print(full_name) # Ada LovelaceДля больших объёмов текста рассмотрите форматные строки или f-строки — они читаются легче, чем длинные цепочки +.
Повторение строк
Оператор * повторяет строку заданное количество раз. Это удобно для создания разделителей, отступов или простых паттернов.
Повторение строки в Python
Изменение регистра
Python предоставляет несколько методов для изменения регистра символов строки.
| Метод | Что делает | Пример: вход → выход |
|---|---|---|
upper() | Все буквы в верхнем регистре | "hello" → "HELLO" |
lower() | Все буквы в нижнем регистре | "HELLO" → "hello" |
title() | Первая буква каждого слова заглавная | "hello world" → "Hello World" |
capitalize() | Первая буква заглавная, остальные строчные | "hELLO" → "Hello" |
swapcase() | Меняет верхний↔нижний регистр каждой буквы | "Hello" → "hELLO" |
Преобразование строки в верхний или нижний регистр в Python
Методы работы с регистром часто используются при сравнении пользовательского ввода независимо от того, как он был набран:
answer = input("Type yes or no: ")
if answer.lower() == "yes":
print("You said yes!")Срезы строк
Срез извлекает часть строки с помощью синтаксиса [start:stop:step]. Результатом является новая строка, содержащая символы с индекса start включительно до индекса stop не включая его.
H e l l o , W o r l d !
0 1 2 3 4 5 6 7 8 9 10 11 12
-13-12-11-10-9 -8 -7 -6 -5 -4 -3 -2 -1Срезы строк в Python
Когда использовать отрицательные индексы
Отрицательные индексы отсчитываются с конца строки. Индекс -1 — последний символ, -2 — предпоследний и так далее. Это удобно, когда нужно получить конец строки, не зная её длины:
filename = "report_2024.csv"
extension = filename[-3:]
print(extension) # csvПодробнее об этом читайте в главе Срезы строк.
Замена подстрок
Метод replace(old, new) возвращает копию строки, в которой каждое вхождение old заменено на new. Передайте третий аргумент count, чтобы ограничить количество замен.
Замена части строки в Python
text = "I like cats. Cats are great. Cats!"
print(text.replace("Cats", "Dogs")) # replaces all occurrences
print(text.replace("Cats", "Dogs", 1)) # replaces first occurrence onlyI like cats. Dogs are great. Dogs!
I like cats. Dogs are great. Cats!Обратите внимание, что replace() чувствителен к регистру: "cats" и "Cats" считаются разными подстроками.
Удаление пробелов
Пробельные символы (пробелы, табуляции, переводы строк) в начале или конце строки часто требуется удалять — особенно при обработке пользовательского ввода или чтении файлов.
| Метод | Удаляет пробелы |
|---|---|
strip() | С обоих концов |
lstrip() | Только слева (в начале) |
rstrip() | Только справа (в конце) |
raw = " hello world "
print(repr(raw.strip())) # 'hello world'
print(repr(raw.lstrip())) # 'hello world '
print(repr(raw.rstrip())) # ' hello world'Можно также удалять конкретные символы, передав их в качестве аргумента:
path = "///usr/local/bin///"
print(path.strip("/")) # usr/local/binРазбиение строк
Метод split(sep) разбивает строку по разделителю и возвращает список подстрок. Без аргумента он разбивает по любому пробельному символу и удаляет пустые строки.
sentence = "Python is easy to learn"
words = sentence.split()
print(words) # ['Python', 'is', 'easy', 'to', 'learn']
csv_row = "Alice,30,Engineer"
fields = csv_row.split(",")
print(fields) # ['Alice', '30', 'Engineer']Передайте второй аргумент maxsplit, чтобы ограничить количество разбиений:
data = "one:two:three:four"
print(data.split(":", 2)) # ['one', 'two', 'three:four']Объединение строк
join() — это операция, обратная split(). Она объединяет список строк в одну, помещая разделитель между каждым элементом. Разделителем служит строка, для которой вызывается join().
words = ["Python", "is", "fun"]
sentence = " ".join(words)
print(sentence) # Python is fun
path_parts = ["usr", "local", "bin"]
path = "/".join(path_parts)
print(path) # usr/local/binИспользование join() значительно эффективнее конкатенации строк в цикле, поскольку каждый + создаёт новый объект строки. join() выделяет память для итоговой строки только один раз.
Поиск внутри строк
Несколько методов помогают найти текст внутри строки.
find() и index()
find(sub) возвращает индекс первого вхождения sub или -1, если подстрока не найдена. index(sub) делает то же самое, но вместо возврата -1 вызывает ValueError.
text = "the quick brown fox"
print(text.find("quick")) # 4
print(text.find("slow")) # -1
print(text.index("brown")) # 10startswith() и endswith()
Эти методы возвращают True или False и являются более чистой альтернативой срезам при проверке начала или конца строки.
url = "https://www.w3docs.com"
print(url.startswith("https")) # True
print(url.endswith(".com")) # True
print(url.startswith("http://")) # FalseМожно передать кортеж префиксов/суффиксов для проверки нескольких вариантов одновременно:
filename = "photo.jpg"
print(filename.endswith((".jpg", ".jpeg", ".png"))) # Truecount()
count(sub) возвращает количество вхождений sub в строку (без перекрытий).
text = "banana"
print(text.count("a")) # 3
print(text.count("an")) # 2Проверка свойств строки
В Python существует семейство методов is*, которые возвращают True или False в зависимости от содержимого строки.
print("hello".isalpha()) # True – all alphabetic
print("hello123".isalnum()) # True – all alphanumeric
print("12345".isdigit()) # True – all digits
print(" ".isspace()) # True – all whitespace
print("Hello World".istitle()) # True – title-caseЭти методы особенно полезны для проверки пользовательского ввода.
Практический пример: очистка пользовательского ввода
В реальных задачах изменение строк часто сочетает несколько техник:
raw_input = " Ada Lovelace "
# Clean and normalise
name = raw_input.strip() # remove surrounding spaces
name = name.title() # ensure proper capitalisation
parts = name.split() # split into first / last
first, last = parts[0], parts[1]
print(f"First: {first}, Last: {last}") # First: Ada, Last: LovelaceКраткий справочник
| Операция | Синтаксис | Возвращает |
|---|---|---|
| Конкатенация | a + b | Новую строку |
| Повторение | s * n | Новую строку |
| Верхний регистр | s.upper() | Новую строку |
| Нижний регистр | s.lower() | Новую строку |
| Регистр заголовка | s.title() | Новую строку |
| Срез | s[start:stop:step] | Новую строку |
| Замена | s.replace(old, new) | Новую строку |
| Удаление пробелов | s.strip() | Новую строку |
| Разбиение | s.split(sep) | Список |
| Объединение | sep.join(iterable) | Новую строку |
| Поиск | s.find(sub) | Целочисленный индекс или -1 |
| Подсчёт | s.count(sub) | Целое число |
| Начинается с | s.startswith(prefix) | boolean |
| Заканчивается на | s.endswith(suffix) | boolean |
Полный список встроенных методов строк смотрите в разделе Методы строк. Чтобы узнать об управляющих последовательностях, таких как \n и \t, смотрите Экранированные символы. Для мощного поиска и манипуляций с текстом с помощью шаблонов смотрите Python Regex.