Работа со строками.

Ссылка на документацию

Строки - это в первую очередь последовательности. Но в отличие от остальных последовательностей они состоят исключительно из символов Unicode.

Если вы определяете строку то ее обязательно необходимо обрамлять кавычками.

Кавычки могут быть одинарными двойными или тройными. Отличаются только тройные тем что сохраняют символы переноса строк. Т.е. если вы используете одинарные или двойные кавычки то перенос строки будет игнориваться при работе со строкой. И при выводе или печати, например, даже если вы вставили переносы строк клавишой Enter то строка все равно выведется в одну строку.

Строковые литералы

Перед строкой может стоять литерал, который указывает на тип данных, из которых состоит строка.

например var = b’hello’ указывает на то, что каждый символ строки закодирован одним байтом.

Если литерал не указан, то в Python 3 за тип данных по умолчанию принимаются символы в кодировке UTF-8. В Python 2 это надо было явно указывать литералом u.

var = u'Привет'

Литерал b указывает на то, что строка состоит из набора байтов (чисел от 0 до 255). В этом диапазоне находядяиься все символы латинского алфавита (кодировка ASCI), цифры и спец-символы (!”№%: и т.д), yj но многие числа этого диапазона не содержат символьной интерпретации. Интерпретация осуществляется функцией chr.

>>> chr(50)
'2'

Например число 119 соответствует символу ‘w’

>>> chr(119)
'w'

Т.к. литерал b говорит об одном байте на символ то невозможно обозначить этим литералом строку, символы которой кодируются более чем одним байтом (например символы кирилицы)

>>> b'Жорик'
File "<stdin>", line 1
    b'Жорик'
    ^^^^
SyntaxError: bytes can only contain ASCII literal characters

Функция bytes

Функция bytes принимает список чисел от 0 до 255 и возвращает байты, получающиеся применением функции chr.

>>> print(bytes([119]))
b'w'
>>> bytes([104, 101, 108, 108, 111])
b'hello'

Bytes возвращает не изменяемый массив но его аналог bytesarray возвратит изменяемый.

Хотя байтовые строки поддерживают практически все строковые методы, с ними мало что нужно делать. Обычно их надо записать в файл / прочесть из файла и преобразовать во что-либо другое. Для преобразования байтов в строку используется метод decode для строки в байты encode.

>>> 'Привет'.encode('utf-8')
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'

>>> b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82'.decode('utf-8')
'Привет'

Кодировка utf-8

Использует переменное количество байт от 1 до 4 на один символ. В примере выше каждый символ кодировался двумя байтами.

xd0\x9f - соответствует символу “П”

>>> b'\xd0\x9f'.decode('utf-8')
'П'

Если взять первый байт \xd0 то

\x - говорит о 16-ричной системе исчисления d0 - шеснадцатиричное число (в десятиричной это 208)

ccылка на онлайн конвертер для разрядности чисел

Очевидно что для utf-8 символов, состоящих из 1 байта (октета) кодировка будет соответствовать однобайтовой кодировке ASCII, где, как говорилось, находятся латинские буквы, цифры, знаки припинания и спец. символы.

>>> b's'.decode('ASCII')
's'
>>> b's'.decode('utf-8')
's'

В процессе кодирования в utf-8 вначале вычисляется количество необходимых байт для символа, а затем в них вписывается номер символа согласно универсальной таблице Unicode, которая содержит символы всех языков мира.

Строка Python, которая закодирована в utf-8 содержит абстракцию, которая не зависит от ее отображения. Поэтому ее невозможно передать по сети или записать на диск не преобразовав в бинарный формат. К счастью, эти процессы преобразования во многих стандартных случаях происходят под капотом и редко возникает необходимость в явном их преобразовании.

Длинна

len('Hello')

Доступ по ключу, срез.

ms = 'My string'
print(ms[0])
print(ms[0:3])

Пробуем поменять символ.

ms[1] = 'e'

TypeError: 'str' object does not support item assignment

Строка это неизменяемый тип, поэтому изменять нужно функциями (методами), которые возвращают новый, измененный экземпляр строки.

Например.

ns = ms.replace('M','W')
>> Yy string

Форматирование строк.

Типы операций со строками

Форматирование можно сделать с помощью оператора %, либо с помощью метода format.

Знак %

s = 'hello %s' % 'dima'
d = 'hello %s your number is %d' % ('dima', '4')

Оператор format.

'{}, {}, {}'.format('a', 'b', 'c')  # 2.7+ only
'{0}, {1}, {2}'.format('a', 'b', 'c')
'{2}, {1}, {0}'.format('a', 'b', 'c')

Символ f

name = 'Dima'
print(f'Hello {Dima}')

Любая строка это объект питон со всеми атрибутами и методами поэтому вызывать методы можно стразу позле определения строки после кавычек.

Проверка типов.

str = 'x = {x_coord}, y = {y_coord:d}'.format(x_coord=23,y_coord=56)

Форматирование числа.

{:,}'.format(1234567890)

Приведение к одному формату (с нулями впереди).

month = '{:02d}'.format(3)

Отсечение чисел после запятой.

print('{:.2f}'.format(222.3333))

Форматирование даты.

import datetime
n = datetime.datetime.now()
'{:%Y-%m-%d %H:%M:%S}'.format(n)

Разбиение

s = 'one,two,three'.split(',')

Слияние

'-'.join(s)

Поиск

string.find(s)
string.rfind(s)

Возвращает число (позиция) первого вхождения или -1 при неудаче.

string.index(s)

Работает так же как find но вызывает исключение при ненахождении.

Поиск по регулярным выражениям.

import re
str = 'My name is dima. My name is dima.'
rez = re.search('is(.*)\.',str)
print(rez.group(1))

Документация по регулярным выражениям

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

str.capitalize(); str.lower(); str.upper()

Убираем пробелы вначале и в конце.

'   spacious   '.strip()