W3docs

Изменение строк

Узнайте, как изменять строки в Python: конкатенация, срезы, методы регистра, replace, strip, split, join и другие. С примерами кода.

Строки в Python — это последовательности символов, заключённые в кавычки. Несмотря на то что строки неизменяемы — их нельзя изменить на месте — Python предоставляет богатый набор операторов и методов, которые возвращают новые изменённые строки. В этой главе рассматриваются важнейшие техники: конкатенация, повторение, преобразование регистра, срезы, замена подстрок, удаление пробелов, разбиение и объединение строк и многое другое.

Ключевая концепция: строки неизменяемы

Прежде чем двигаться дальше, важно понять: каждый метод «изменения» возвращает новую строку. Исходная строка никогда не меняется.

greeting = "hello"
upper_greeting = greeting.upper()

print(greeting)        # hello  (unchanged)
print(upper_greeting)  # HELLO  (new string)

Это означает, что результат необходимо присвоить переменной (или использовать напрямую), чтобы сохранить изменения.

Конкатенация строк

Конкатенация объединяет две и более строки в одну с помощью оператора +. Можно соединить сколько угодно строк в цепочку.

Конкатенация строк в Python

python— editable, runs on the server

Конкатенация переменных и литералов

Можно смешивать строковые переменные со строковыми литералами:

first_name = "Ada"
last_name  = "Lovelace"
full_name  = first_name + " " + last_name
print(full_name)  # Ada Lovelace

Для больших объёмов текста рассмотрите форматные строки или f-строки — они читаются легче, чем длинные цепочки +.

Повторение строк

Оператор * повторяет строку заданное количество раз. Это удобно для создания разделителей, отступов или простых паттернов.

Повторение строки в Python

python— editable, runs on the server

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

Python предоставляет несколько методов для изменения регистра символов строки.

МетодЧто делаетПример: вход → выход
upper()Все буквы в верхнем регистре"hello""HELLO"
lower()Все буквы в нижнем регистре"HELLO""hello"
title()Первая буква каждого слова заглавная"hello world""Hello World"
capitalize()Первая буква заглавная, остальные строчные"hELLO""Hello"
swapcase()Меняет верхний↔нижний регистр каждой буквы"Hello""hELLO"

Преобразование строки в верхний или нижний регистр в Python

python— editable, runs on the server

Методы работы с регистром часто используются при сравнении пользовательского ввода независимо от того, как он был набран:

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

python— editable, runs on the server

Когда использовать отрицательные индексы

Отрицательные индексы отсчитываются с конца строки. Индекс -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 only
I 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"))  # 10

startswith() и 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")))  # True

count()

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.

Практика

Практика
Which of the following Python string methods or operations return a new string rather than modifying in place?
Which of the following Python string methods or operations return a new string rather than modifying in place?
Was this page helpful?