# Содержание
Строки в питоне;
Срезы (slices);
Методы строк;
Метод count;
Метод replace;
Метод find и rfind;
Подготовка строк перед обработкой;
Метод partition и rpartition;
Методы startswith и endswith, проверка наличия подстроки;
Другие методы строк;
Форматирование строк. Метод format;
f-строки;
# Строки в питоне
В языке Python 3 строки — это строки последовательности юникодных символов.
Для обозначения конкретной строки в программе можно использовать одну из четырёх возможных конструкций:
a = 'В этой строке можно использовать символ ", а обычную кавычку нужно экранировать'
b = "Здесь можно писать ', но \" нужно экранировать: \" "
с = '''Строка на
несколько строк (можно писать ' и " свободно)'''
d = """То же самое, только кавычки другие \
нужно использовать \, чтобы экранировать конец строки"""
Конечно же, строки можно также получать из других типов приведением к строке, а также получать из внешних источников.
Строка считывается со стандартного ввода функцией input(). Напомним,
что для двух строк определа операция сложения (конкатенации), также определена
операция умножения строки на число.
Строка состоит из последовательности символов. Узнать количество символов (длину строки)
можно при помощи функции len:
>>> S = 'Hello'
>>> print(len(S))
5
# Срезы (slices)
Срез (slice) — извлечение из данной строки одного символа или некоторого фрагмента
подстроки или подпоследовательности.
Есть три формы срезов. Самая простая форма среза: взятие одного символа
строки, а именно, S[i] — это срез, состоящий из одного символа,
который имеет номер i, при этом считая, что нумерация начинается
с числа 0. То есть если S='Hello', то
S[0]=='H', S[1]=='e', S[2]=='l',
S[3]=='l', S[4]=='o'.
Номера символов в строке (а также в других структурах данных: списках, кортежах)
называются индексом.
Если указать отрицательное значение индекса, то номер будет отсчитываться
с конца, начиная с номера -1. То есть S[-1]=='o',
S[-2]=='l', S[-3]=='l', S[-4]=='e',
S[-5]=='H'.
Или в виде таблицы:
| Строка S |
H |
e |
l |
l |
o |
| Индекс |
S[0] |
S[1] |
S[2] |
S[3] |
S[4] |
| Индекс |
S[-5] |
S[-4] |
S[-3] |
S[-2] |
S[-1] |
Если же номер символа в срезе строки S больше либо равен len(S),
или меньше, чем -len(S), то при обращении к этому символу строки произойдет
ошибка IndexError: string index out of range.
Срез с двумя параметрами: S[a:b]
возвращает подстроку из b-a символов,
начиная с символа c индексом a,
то есть до символа с индексом b, не включая его.
Например, S[1:4]=='ell', то же самое получится
если написать S[-4:-1]. Можно использовать как положительные,
так и отрицательные индексы в одном срезе, например, S[1:-1] —
это строка без первого и последнего символа (срез начинается с символа с индексом 1 и
заканчиватеся индексом -1, не включая его).
При использовании такой формы среза ошибки IndexError
никогда не возникает. Например, срез S[1:5]
вернет строку 'ello', таким же будет результат,
если сделать второй индекс очень большим, например,
S[1:100] (если в строке не более 100 символов).
Если опустить второй параметр (но поставить двоеточие),
то срез берется до конца строки. Например, чтобы удалить
из строки первый символ (его индекс равен 0, то есть
взять срез, начиная с символа с индексом 1), то можно
взять срез S[1:], аналогично
если опустиить первый параметр, то срез берется от начала строки.
То есть удалить из строки последний символ можно при помощи среза
S[:-1]. Срез S[:] совпадает с самой строкой
S.
Если задать срез с тремя параметрами S[a:b:d],
то третий параметр задает шаг, как в случае с функцией
range, то есть будут взяты символы с индексами
a, a+d, a+2*d и т.д.
При задании значения третьего параметра, равному 2, в срез попадет
кажый второй символ, а если взять значение среза, равное
-1, то символы будут идти в обратном порядке.
# Методы строк
Метод — это функция, применяемая к объекту, в данном случае — к строке.
Метод вызывается в виде объект.метод(параметры).
Например, S.find("e") — это применение к строке S
метода find с одним параметром "e".
# Метод count
Подсчитывает количество вхождений одной строки в другую строку. Простейшая
форма вызова S.count(T) возвращает число вхождений строки
T внутри строки S. При этом подсчитываются только
непересекающиеся вхождения, например:
>>> 'Abracadabra'.count('a')
4
>>> ('a' * 100000).count('aa')
50000
При указании трех параметров S.count(T, a, b),
будет выполнен подсчет числа вхождений строки T
в срез S[a:b].
# Метод replace
Метод replace заменяет все вхождения одной строки на другую. Формат:
S.replace(old, new) — заменить в строке S
все вхождения подстроки old на подстроку new. Пример:
>>> 'Hello'.replace('l', 'L')
'HeLLo'
Если методу replace задать еще один параметр: S.replace(old, new, count),
то заменены будут не все вхождения, а только не больше, чем первые count из них.
>>> 'Abrakadabra'.replace('a', 'A', 2)
'AbrAkAdabra'
# Метод find и rfind
Метод find находит в данной строке (к которой применяется метод)
данную подстроку (которая передается в качестве параметра).
Функция возвращает индекс первого вхождения искомой подстроки.
Если же подстрока не найдена, то метод возвращает значение -1. Например:
>>> S = 'Hello'
>>> print(S.find('e'))
1
>>> print(S.find('ll'))
2
>>> print(S.find('L'))
-1
Аналогично, метод rfind возвращает индекс последнего вхождения
данной строки («поиск справа»).
>>> S = 'Hello'
>>> print(S.find('l'))
2
>>> print(S.rfind('l'))
3
Если вызвать метод find с тремя параметрами
S.find(T, a, b), то поиск будет осуществляться
в срезе S[a:b]. Если указать только два параметра
S.find(T, a), то поиск будет осуществляться
в срезе S[a:], то есть начиная с символа с индексом
a и до конца строки. Метод S.find(T, a, b)
возращает индекс в строке S, а не индекс относительно
начала среза.
# Подготовка строк перед обработкой
В дзене питона есть такая фраза: «Особые случаи не настолько особые, чтобы нарушать правила».
Иногда начало строки или её конец нужно обрабатывать как-то по-особенному, не так, как её середину.
Например, если вы сравниваете соседние символы, то у последнего не будет следующего за ним.
Очень часто эти «особые» случае можно сделать «обычными» если просто подклеить к строке в начало или в конец какой-нибудь символ или даже строку.
Например, если к строке подклеить в конец пробел, то после каждого слова в строке будет обязательно идти не-буква, и последнее слово не будет «особым».
# Метод partition и rpartition
Метод partition находит в данной строке данную подстроку (которая передается в качестве параметра) и разрезает
по ней.
Функция возвращает кортеж из трёх элементов: то, что было до подстроки, саму подстроку и то, что было после подстроки.
Если же подстрока не найдена, то метод возвращает кортеж из всей строки и ещё двух пустых подстрок.
>>> s = 'Аргентина-Ямайка'
>>> s.partition('-')
('Аргентина', '-', 'Ямайка')
>>> s.partition('@')
('Аргентина-Ямайка', '', '')
>>> '16:47:09'.partition(':')
('16', ':', '47:09')
>>> '123 + 456'.partition(' + ')
('123', ' + ', '456')
Очень удобно результат работы метода partition сразу класть в три переменны: до, разделить, после:
>>> hh, sep, mm = '16:47'.partition(':')
>>> print(hh, mm)
16 47
Аналогично, метод rpartition режет по самому правому вхождению:
>>> s = 'Это длинный текст'
>>> begginning, space, last_word = s.rpartition(' ')
>>> print(repr(begginning), repr(last_word))
'Это длинный' 'текст'
# Методы startswith и endswith, проверка наличия подстроки
В тех случаях, когда нужно проверить, что строка начинается или заканчивается некоторой подстрокой,
то вместо срезов принято использовать методы startswith и endswith:
>>> 'Abracadabra'.startswith('Ab')
True
>>> 'Abracadabra'.endswith('BRA')
False
Для проверки наличия подстроки кроме метода find можно использовать простую конструкцию:
>>> 'acad' in 'Abracadabra'
True
# Другие методы строк
| Функция | Описание | Пример |
| Строчные/прописные |
str.capitalize |
Переводит первый символ строки в верхний регистр, а все остальные в нижний |
>>> 'привет, МИР!'.capitalize()
'Привет, мир!' |
str.lower |
Преобразование строки к нижнему регистру |
>>> 'Странная ФУНКция'.lower()
'странная функция'
|
str.swapcase |
Переводит символы нижнего регистра в верхний, а верхнего – в нижний |
>>> 'Странная ФУНКция'.swapcase()
'сТРАННАЯ функЦИЯ' |
str.title |
Первую букву каждого слова переводит в верхний регистр, а все остальные в нижний |
>>> 'Странная ФУНКция'.title()
'Странная Функция'
|
str.upper |
Преобразование строки к верхнему регистру |
>>> 'Странная ФУНКция'.upper()
'СТРАННАЯ ФУНКЦИЯ'
|
| Обрезка и выравнивание |
str.center(width, [fill]) |
Возвращает отцентрованную строку, по краям которой стоит символ fill (пробел по умолчанию) |
>>> 'xxx'.center(7)
' xxx '
|
str.ljust(width, fillchar=" ") |
Делает длину строки не меньшей width, по необходимости заполняя последние символы символом fillchar. Также есть метод rjust, выравнивающий по правому краю |
>>> 'xxx'.ljust(7)
'xxx '
>>> 'xxx'.rjust(7)
' xxx'
|
str.zfill(width) |
Делает длину строки не меньшей width, по необходимости заполняя первые символы нулями |
>>> '123'.zfill(5)
'00123'
|
str.strip([chars]) |
Удаление пробельных символов в начале и в конце строки, либо символов из параметра chars, если он передан. Также есть команды lstrip и rstrip, удаляющие символы только слева или только справа |
>>> ' foo bo zooo '.strip()
'foo bo zooo'
>>> '( ни за что!:-))'.strip('()-: ')
'ни за что!'
|
| Проверка типа строки |
str.isalnum |
Состоит ли строка из букв и цифр |
>>> 'Wy7'.isalnum()
True
|
str.isalpha |
Состоит ли строка из букв |
>>> 'Wy7'.isalpha()
False
|
str.isdigit |
Состоит ли строка из цифр |
>>> '12313'.isdigit()
True
|
str.islower |
Состоит ли строка из символов в нижнем регистре |
>>> 'привет, мир'.islower()
True
|
str.isspace |
Состоит ли строка из неотображаемых символов (пробел, табуляция, перенос строки и т.п.) |
>>> ' \n\t\r'.isspace()
True
|
str.isupper |
Состоит ли строка из символов в верхнем регистре |
>>> 'ПРИВЕТ, МИР'.isupper()
True
|
| Нарезка и склейка строк |
str.join |
Склеивает все строки из переданного параметра, используя соединитель (возможно, пустой) |
>>> ', '.join(('кот', 'пёс', 'ёж'))
'кот, пёс, ёж'
|
str.split(sep=None, maxsplit=-1) |
Разрезать строку по пробельным символам. Если указан sep, то по символам sep. Если указан maxsplit, то нарезается не более, чем на указанное количество кусков. Также есть метод rsplit, который выдаст не более maxsplit кусков, считая справа |
>>> 'пёт кот слон'.split()
['пёт', 'кот', 'слон']
>>> 'foo, boo, zoo'.split(', ')
['foo', 'boo', 'zoo']
|
str.splitlines |
Нарезать большой кусок текста на строки по любому из символов переноса ст |
>>> """И днём, и ночью
Кот учёный...""".splitlines()
['И днём, и ночью', 'Кот учёный...']
|
str.partition |
Ищет шаблон в строке. Возвращает кортеж из строки до шаблона, самого шаблона, и строки после. |
>>> 'fooboozoo'.partition('boo')
('foo', 'boo', 'zoo')
|
| Посимвольная замена |
str.maketrans |
Создаёт таблицу замены для translate. Принимает на вход две строки одинаковой длины. |
>>> trans = str.maketrans('бгл', 'bgl')
|
str.translate |
Используя изготовленную при помощи maketrans таблицу, произвести посимвольную замену |
>>> 'благодать'.translate(trans)
'blаgодать'
|
Кроме того, в модуле string можно найти ряд полезных констант:
string.ascii_letters = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_lowercase = abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase = ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits = 0123456789
string.hexdigits = 0123456789abcdefABCDEF
string.octdigits = 01234567
string.punctuation = !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
string.printable = 0123456789abcdefghijklmnopqrstuvwxyzABCD...
string.whitespace = " \t..."
Они включают себя только ASCII символы, поэтому разные тонкие вещи с юникодом решать не помогут.
# Форматирование строк. Метод format
Иногда (а точнее, довольно часто) возникают ситуации, когда нужно сделать строку, подставив в неё некоторые данные, полученные в процессе выполнения программы (пользовательский ввод, данные из файлов и т. д.).
В этом случае для подстановки этих значений можно использовать строковый метод format.
При этом в шаблоне в места подстановок нужно поставить якори вида {}, а в параметры format передать ровно необходимое количество значений.
Однако возможностей у format гораздо больше: кроме непосредственной подстановки в строку возможно применение форматирования в выводимым данным.
Полный список возможностей можно получить непосредственно в документации,
а здесь будет список разумных примеров использования этого метода:
>>> '{}, {}, {}'.format('a', 'b', 'c')
'a, b, c'
>>> '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>> '{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>> '{0}{1}{0}'.format('abra', 'cad')
'abracadabra'
>>> 'Coordinates: {lat}, {lon}'.format(lat='37.24N', lon='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>> '{:<30}'.format('left aligned')
'left aligned '
>>> '{:>30}'.format('right aligned')
' right aligned'
>>> '{:^30}'.format('centered')
' centered '
>>> '{:*^30}'.format('centered')
'***********centered***********'
>>> '{:+f}; {:+f}'.format(3.14, -3.14)
'+3.140000; -3.140000'
>>> '{: f}; {: f}'.format(3.14, -3.14)
' 3.140000; -3.140000'
>>> '{:0.2f}; {:0.3f}; {:8.3f}'.format(3.14, -3.14, 179e-4)
'3.14; -3.140; 0.018'
>>> "int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42)
'int: 42; hex: 2a; oct: 52; bin: 101010'
>>> "int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
'int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010'
# f-строки
Начиная с Python 3.6 появился ещё один способ получения строк, в которые вставлены значения некоторых переменных. Кроме того, что этот способ очень хорошо читается, он ещё и самый быстрый.
Начнём с примера:
>>> x = 10
>>> y = 5
>>> print(f"{x} x {y} / 2 = {x * y / 2}")
>>> 10 x 5 / 2 = 25.0
>>> planets = ["Меркурий", "Венера", "Земля", "Марс"]
>>> print(f"Мы живём не планете {planets[2]}")
>>> Мы живём не планете Земля
В целом этот подход очень похож на использование метода .format, только необходимо всегда указывать префикс f перед строкой и имена переменных внутри фигурных скобок.
Возможностей того, что можно указывать внутри фигурных скобок достаточно много: pep-0498.