Создание
Строка — неизменяемая последовательность символов Unicode:
1a = "текст"2b = 'text'3c = """многострочный4текст"""5d = str(123)6e = str([1, 2])7f = ""8g = r"C:\path\n"
Общие операции
1s = "Python" 2 3print(len(s)) 4print(s[0], s[-1]) 5print(s[1:4]) 6print(s * 2) 7print(s + "!") 8print("th" in s) 9print(max(s), min(s))10print(sorted(s))11print(list(s))
Строки поддерживают индексы, срезы, итерацию, in, сравнение по коду символа. Изменить символ по индексу нельзя:
1s = "abc"2s = s[:1] + "X" + s[2:]3print(s)
Методы str
Регистр
| Метод | Описание |
|---|
lower() | Нижний регистр |
upper() | Верхний регистр |
casefold() | Агрессивный нижний регистр для сравнения без учёта регистра |
capitalize() | Первая буква заглавная, остальные строчные |
title() | Каждое слово с заглавной буквы |
swapcase() | Инвертирует регистр |
Проверки
| Метод | Описание |
|---|
isalpha() | Только буквы |
isdigit() | Только цифры |
isdecimal() | Только десятичные цифры |
isnumeric() | Числовые символы, включая дроби и римские цифры |
isalnum() | Буквы и цифры |
isspace() | Только пробельные символы |
islower(), isupper(), istitle() | Проверки регистра |
isidentifier() | Допустимый идентификатор |
isprintable() | Все символы печатаемые |
isascii() | Все символы из ASCII |
startswith(prefix[, start, end]) | Начинается с префикса, можно передать кортеж |
endswith(suffix[, start, end]) | Заканчивается суффиксом, можно передать кортеж |
Поиск и подсчёт
| Метод | Описание |
|---|
find(sub[, start, end]) | Индекс первого вхождения или -1 |
rfind(sub[, start, end]) | Индекс последнего вхождения или -1 |
index(sub[, start, end]) | Как find, но вызывает ValueError |
rindex(sub[, start, end]) | Как rfind, но вызывает ValueError |
count(sub[, start, end]) | Число непересекающихся вхождений |
Преобразование и очистка
| Метод | Описание |
|---|
strip([chars]) | Удаляет символы с обоих концов |
lstrip([chars]), rstrip([chars]) | Удаляют слева или справа |
removeprefix(prefix) | Удаляет префикс, если он есть |
removesuffix(suffix) | Удаляет суффикс, если он есть |
replace(old, new[, count]) | Замена подстроки |
translate(table) | Замена символов по таблице |
str.maketrans(x[, y[, z]]) | Создаёт таблицу для translate |
expandtabs(tabsize=8) | Заменяет табуляции пробелами |
Разбиение и склейка
| Метод | Описание |
|---|
split(sep=None, maxsplit=-1) | Разбивает на список |
rsplit(sep=None, maxsplit=-1) | То же, но справа |
splitlines(keepends=False) | Разбивает по границам строк |
partition(sep) | Кортеж (до, разделитель, после) |
rpartition(sep) | То же с последнего вхождения |
join(iterable) | Склеивает строки через разделитель |
Выравнивание
| Метод | Описание |
|---|
center(width[, fill]) | По центру |
ljust(width[, fill]) | По левому краю |
rjust(width[, fill]) | По правому краю |
zfill(width) | Дополняет нулями слева |
Кодирование и форматирование
| Метод | Описание |
|---|
encode(encoding="utf-8", errors="strict") | Строка в bytes |
format(*args, **kwargs) | Форматирование по шаблону |
format_map(mapping) | Форматирование из словаря |
Примеры
1s = " Hello, World! " 2 3print(s.strip()) 4print(s.strip().lower()) 5print(s.replace("World", "Python")) 6print(s.strip().split(", ")) 7print(s.find("World")) 8print(s.count("l")) 9print("a,b,c".split(","))10print("a,b,c".rsplit(",", 1))11print("a b c".split())12print("one\ntwo\nthree".splitlines())13print("key=value=x".partition("="))14print("-".join(["a", "b", "c"]))15print("42".zfill(5))16print("abc".center(9, "*"))17print("file.txt".removesuffix(".txt"))18print("Hello".startswith(("He", "Ha")))
translate
1table = str.maketrans("абв", "abc")2print("абвгд".translate(table))34remove_digits = str.maketrans("", "", "0123456789")5print("a1b2c3".translate(remove_digits))
Сравнение без учёта регистра
1print("Straße".lower() == "STRASSE".lower())2print("Straße".casefold() == "STRASSE".casefold())
Результат: False и True.
Форматирование
1name = "Anna" 2score = 93.456 3 4print(f"{name}: {score:.1f}") 5print(f"{name:>10}|") 6print(f"{name:<10}|") 7print(f"{name:^10}|") 8print(f"{name:*^10}") 9print(f"{255:#x}")10print(f"{score=}")11print(f"{name!r}")12print("{0} и {1}, {0}".format("a", "b"))13print("{x}-{y}".format(x=1, y=2))14print("%s=%d" % ("x", 5))
Мини-язык спецификаций
Формат [[fill]align][sign][#][0][width][,][.precision][type]:
| Часть | Значения |
|---|
| align | <, >, ^, = |
| sign | +, -, пробел |
| type для чисел | d, b, o, x, X, e, f, g, % |
| type для строк | s |
Unicode и кодировки
1text = "Привет"23data = text.encode("utf-8")4print(data)5print(len(text), len(data))6print(data.decode("utf-8"))7print(text.encode("cp1251"))8print(ord("A"), chr(65))9print("\u0416")
Ошибки кодирования можно обрабатывать параметром errors: "strict", "ignore", "replace", "backslashreplace".
1print("héllo".encode("ascii", errors="replace"))2print("héllo".encode("ascii", errors="ignore"))
Для нормализации Unicode (например, é как один символ или как два) есть модуль unicodedata:
1import unicodedata23a = "\u00e9"4b = "e\u0301"5print(a == b)6print(unicodedata.normalize("NFC", a) == unicodedata.normalize("NFC", b))
Производительность
Из-за неизменяемости склейка строк в цикле через += создаёт много временных объектов. Лучше собрать части в список и вызвать join:
1parts = []2for i in range(5):3 parts.append(str(i))4result = ",".join(parts)5print(result)
Задания
- Реализуйте функцию подсчёта частоты слов без учёта регистра и пунктуации.
- Напишите функцию, превращающую
snake_case в camelCase. - Проверьте, является ли строка анаграммой другой строки.