Операции со строками Python

Помимо базового набора инструментов для работы со строками Python также поддерживает более сложные приемы обработки строк, основанные на применении шаблонов, с помощью библиотечного модуля re (regular expression – регулярные выражения),  а кроме того, такие высокоуровневые инструменты обработки текста, как парсеры XML.

Экранирование последовательности

Как было показано, экранированные последовательности удобно использовать
для вставки в строки служебных символов. Однако иногда зарезервированная экранированная последовательность может порождать неприятности. Очень
часто, например, можно увидеть, как начинающие программисты пытаются открыть файл, передавая аргумент с именем файла, который имеет примерно следующий вид:

myfile = open(‘C:\new\text.dat’, ‘w’)

думая, что они открывают файл с именем text.dat в каталоге C:\new. Проблема
здесь заключается в том, что последовательность \n интерпретируется как сим-
вол новой строки, а последовательность \t замещается символом табуляции.
В результате функция open будет пытаться открыть файл с именем C:(newline)
ew(tab)ext.dat, причем обычно безуспешно.
Именно в таких случаях удобно использовать неформатированные строки.
Если перед кавычкой, открывающей строку, стоит символ r (в верхнем или в нижнем регистре), он отключает механизм экранирования. В результате интерпретатор Python будет воспринимать символы обратного слеша в строке как обычные символы. Таким образом, чтобы ликвидировать проблему, связанную с именами файлов в Windows, не забывайте добавлять символ r.

myfile = open(r’C:\new\text.dat’, ‘w’)

Как вариант, учитывая, что два идущих подряд символа обратного слеша  интерпретируются как один символ, можно просто продублировать символы обратного слеша:

myfile = open(‘C:\\new\\text.dat’, ‘w’)

Разбиение и объединение строки

Встроенная функция list (или функция-конструктор объекта) создает новый
список из элементов любой последовательности – в данном случае «разрывая»
строку на символы и формируя из них список. Обладая строкой в таком пред-
ставлении, можно производить необходимые изменения, не вызывая создание
новой копии строки при каждом изменении:

>>> L[3] = ‘x’ # Этот прием допустим для списков, но не для строк
>>> L[4] = ‘x’
>>> L
[‘s’, ‘p’, ‘a’, ‘x’, ‘x’, ‘y’]

Если после внесения изменений необходимо выполнить обратное преобразова-
ние (чтобы, например, записать результат в файл), можно использовать метод
join, который «собирает» список обратно в строку:

>>> S = ‘’.join(L)
>>> S
‘spaxxy’

Метод join на первый взгляд может показаться немного странным. Так как он
является строковым методом (а не методом списка), он вызывается через ука-
зание желаемой строки-разделителя. Метод join объединяет строки из списка,
вставляя строку-разделитель между элементами списка. В данном случае при
получении строки из списка используется пустая строка-разделитель. В более
общем случае можно использовать произвольную строку-разделитель:

>> ‘SPAM’.join([‘eggs’, ‘sausage’, ‘ham’, ‘toast’])
‘eggsSPAMsausageSPAMhamSPAMtoast’

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

Чтобы отформатировать строку, требуется:
1. Слева от оператора % указать строку формата, содержащую один или более
спецификаторов формата, каждый из которых начинается с символа % (на-
пример, %d).
2. Справа от оператора % указать объект (или объекты, в виде кортежа), значе-
ние которого должно быть подставлено на место спецификатора (или специ-
фикаторов) в левой части выражения.
Например, в примере форматирования строки, который приводился ранее
в этой главе, мы видели, что целое число 1 замещает спецификатор %d в строке
формата, расположенной в левой части выражения, а строка “dead” замещает
спецификатор %s. В результате получается новая строка, которая содержит эти
две подстановки.

>>> ‘That is %d %s bird!’ % (1, ‘dead’) # Выражение форматирования
That is 1 dead bird!

Строго говоря, выражения форматирования строк не являются абсолютно
необходимыми – все, что можно сделать с их помощью, точно так же можно
сделать с помощью серии преобразований и операций конкатенации. Однако
операция форматирования позволяет объединить множество шагов в одной
инструкции. Мощные возможности этой операции заслуживают того, чтобы
рассмотреть еще несколько примеров:

>> exclamation = “Ni”
>>> “The knights who say %s!” % exclamation
‘The knights who say Ni!’
>>> “%d %s %d you” % (1, ‘spam’, 4)
‘1 spam 4 you’
>>> “%s — %s — %s” % (42, 3.14159, [1, 2, 3])
‘42 — 3.14159 — [1, 2, 3]’

Спецификаторы формата

Форматирование строк из словаря

Операция форматирования позволяет также использовать в спецификаторах
формата ссылки на ключи словаря, который указывается в правой части выражения, для извлечения соответствующих значений. Мы пока немного говорили о словарях, поэтому следующий пример демонстрирует самый простой
случай:

> “%(n)d %(x)s” % {“n”:1, “x”:”spam”}
‘1 spam’

В данном случае (n) и (x) в строке формата ссылаются на ключи в словаре в правой части выражения и служат для извлечения соответствующих им значений. Этот прием часто используется в программах, создающих код разметки HTML или XML, – вы можете построить словарь значений и затем подставить их все одним выражением форматирования, которое использует ключи:

>>> reply = “”” # Шаблон с замещаемыми спецификаторами формата
Greetings…
Hello %(name)s!
Your age squared is %(age)s
“””
>>> values = {‘name’: ‘Bob’, ‘age’: 40} # Подготовка фактических значений
>>> print reply % values # Подстановка значений
Greetings…
Hello Bob!
Your age squared is 40

Этот способ также часто используется в комбинации со встроенной функцией
vars, которая возвращает словарь, содержащий все переменные, существую-
щие на момент ее вызова:

>> food = ‘spam’
>>> age = 40
>>> vars()
{‘food’: ‘spam’, ‘age’: 40, …и еще множество других… }

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

>> “%(age)d %(food)s” % vars()
‘40 spam’

Методы форматирования строк

В двух словах, новый метод format объектов строк, появившийся в версиях 2.6 и 3.0 (и выше), использует строку, относительно которой он вызывается, как шаблон и принимает произвольное количество аргументов, представляющих значения для подстановки. Фигурные скобки внутри строки шаблона используются для обозначения замещаемых спецификаторов и их параметров, которые могут определять порядковые номера позиционных аргументов (например, {1}) или имена именованных аргументов (например, {food}).

> template = ‘{0}, {1} and {2}’ # Порядковые номера позиционных аргументов
>>> template.format(‘spam’, ‘ham’, ‘eggs’)
‘spam, ham and eggs’

>>> template = ‘{motto}, {pork} and {food}’ # Имена именованных аргументов
>>> template.format(motto=’spam’, pork=’ham’, food=’eggs’)
‘spam, ham and eggs’

>>> template = ‘{motto}, {0} and {food}’ # Оба варианта
>>> template.format(‘ham’, motto=’spam’, food=’eggs’)
‘spam, ham and eggs’

Естественно, строка шаблона также может быть литералом, кроме того, сохра-
няется возможность подстановки значений объектов любых типов:

>> ‘{motto}, {0} and {food}’.format(42, motto=3.14, food=[1, 2])
‘3.14, 42 and [1, 2]’