Математический анализ. 3е издание
Скачать 4.86 Mb.
|
180 Глава 7. Строки последовательностей, такими как списки и кортежи, которые мы бу дем рассматривать позже. В табл. 7.1 приводятся наиболее типичные литералы строк и операций, которые обсуждаются в этой главе. Пустые строки записываются как пара кавычек (или апострофов), между которыми ничего нет; и сущест вуют различные способы записи строк в программном коде. Для работы со строками поддерживаются операции выражений, такие как конка тенация (объединение строк), выделение подстроки, выборка символов по индексам (по смещению от начала строки) и т. д. Помимо выраже ний язык Python предоставляет ряд строковых методов, которые реа лизуют обычные задачи работы со строками, а также модули для реше ния более сложных задач обработки текста, таких как поиск по шабло ну. Все эти инструменты будут рассматриваться далее в этой же главе. Таблица 7.1. Наиболее типичные литералы строк и операции Помимо базового набора инструментов для работы со строками, Python также поддерживает более сложные приемы обработки строк, основан ные на применении шаблонов, с помощью библиотечного модуля re (re gular expression – регулярные выражения), о котором говорилось в гла ве 4. Данная глава начинается с краткого обзора форм строковых лите ралов и базовых строковых выражений, затем мы перейдем к более сложным инструментам, таким как методы строк и форматирование. Операция Интерпретация s1 = '' Пустая строка s2 = "spam's" Строка в кавычках block = """...""" Блоки в тройных кавычках s3 = r'\temp\spam' Неформатированные строки s4 = u'spam' Строки с символами Юникода s1 + s2 s2 * 3 Конкатенация, повторение s2[i] s2[i:j] len(s2) Обращение к символу по индексу, извлечение под строки (среза), длина "a %s parrot" % type Форматирование строки s2.find('pa') s2.rstrip() s2.replace('pa', 'xx') s1.split(',') s1.isdigit() s1.lower() Методы строк: поиск, удаление пробелов, поиск с заменой, разбиение на подстроки по символураз делителю, проверка содержимого, преобразование регистра символов и т. д. for x in s2 'spam' in s2 Обход в цикле, проверка на вхождение Литералы строк 181 Литералы строк Вообще говоря, работать со строками в языке Python достаточно удоб но. Самое сложное, пожалуй, – это наличие множества способов запи си строк в программном коде: • Строки в апострофах: 'spa"m' • Строки в кавычках: "spa'm" • Строки в тройных кавычках: '''... spam ...''', """... spam ...""" • Экранированные последовательности: "s\tp\na\0m" • Неформатированные строки: r"C:\new\test.spm" • Строки символов Юникода: u'eggs\u0020spam' Варианты представления строк в апострофах и кавычках являются наиболее типичными, остальные играют особую роль. Давайте корот ко рассмотрим каждый из этих вариантов. Строки в апострофах и в кавычках – это одно и то же Кавычки и апострофы, окружающие строки, в языке Python являются взаимозаменяемыми. То есть строковые литералы можно заключать как в апострофы, так и в кавычки – эти две формы представления строк ничем не отличаются и обе они возвращают объект того же само го типа. Например, следующие две строки совершенно идентичны: >>> 'shrubbery', "shrubbery" ('shrubbery', 'shrubbery') Причина наличия двух вариантов состоит в том, чтобы позволить вставлять в литералы символы кавычек и апострофов, не используя для этого символ обратного слеша. Вы можете вставлять апострофы в строки, заключенные в кавычки, и наоборот: >>> 'knight"s', "knight's" ('knight"s', "knight's") Между прочим, Python автоматически объединяет последовательно сти строковых литералов внутри выражения, хотя нет ничего сложно го в том, чтобы добавить оператор + между литералами и вызвать опе рацию конкатенации явно: >>> title = "Meaning " 'of' " Life" # Неявная конкатенация >>> title 'Meaning of Life' Обратите внимание, если добавить запятые между этими строками, будет получен кортеж, а не строка. Кроме того, заметьте, что во всех этих примерах интерпретатор предпочитает выводить строки в апост рофах, если их нет внутри строки. Кавычки и апострофы можно встав лять в строки, экранируя их символом обратного слеша: 182 Глава 7. Строки >>> 'knight\'s', "knight\"s" ("knight's", 'knight"s') Чтобы понять, зачем, вам необходимо узнать, как работает механизм экранирования вообще. Экранированные последовательности представляют служебные символы В последнем примере вставляемые в строку кавычка и апостроф пред варяются символом обратного слеша. Это частный случай более общей формы: символы обратного слеша используются для вставки специаль ных символов, известных как экранированные последовательности. Экранированные последовательности позволяют вставлять в строки символы, которые сложно ввести с клавиатуры. В конечном строко вом объекте символ \ и один или более следующих за ним символов за мещаются единственным символом, который имеет двоичное значе ние, определяемое экранированной последовательностью. Например, ниже приводится строка из пяти символов, в которую вставлены сим вол новой строки и табуляции: >>> s = 'a\nb\tc' Последовательность \n образует единственный символ – байт, содер жащий двоичное значение кода символа новой строки в используемом наборе символов (обычно ASCIIкод 10). Аналогично последователь ность \t замещается символом табуляции. Как будет выглядеть такая строка при печати, зависит от того, как она выводится. Функция авто матического вывода в интерактивной оболочке отобразит служебные символы как экранированные последовательности, а инструкция print будет интерпретировать их: >>> s 'a\nb\tc' >>> print s a b c Чтобы окончательно убедиться, сколько байтов входит в эту строку, можно воспользоваться встроенной функцией len – она возвращает фактическое число байтов в строке независимо от того, как строка ото бражается на экране: >>> len(s) 5 Длина этой строки составляет пять байтов: она содержит байт ASCII символа a, байт символа новой строки, байт ASCIIсимвола b и т. д. Об ратите внимание, что символы обратного слеша не сохраняются в па мяти строкового объекта. Для представления служебных символов язык Python обеспечивает полный набор экранированных последова тельностей, перечисленных в табл. 7.2. Литералы строк 183 Таблица 7.2. Экранированные последовательности Некоторые экранированные последовательности позволяют указы вать абсолютные двоичные значения в байтах строк. Например, ниже приводится пример строки из пяти символов, содержащей два нуле вых байта: >>> s = 'a\0b\0c' >>> s 'a\x00b\x00c' >>> len(s) 5 В языке Python нулевой байт (символ null) не является признаком за вершения строки, как в языке C. Интерпретатор просто сохраняет в памяти как текст самой строки, так и ее длину. Фактически в языке Последовательность Назначение \newline Игнорируется (продолжение на новой строке) \\ Сам символ обратного слеша (остается один символ \) \' Апостроф (остается один символ ') \" Кавычка (остается один символ ") \a Звонок \b Забой \f Перевод формата \n Новая строка (перевод строки) \r Возврат каретки \t Горизонтальная табуляция \v Вертикальная табуляция \N{id} Идентификатор ID базы данных Юникода \uhhhh 16битовый символ Юникода в шестнадцатеричном представлении \Uhhhh... 32битовый символ Юникода в шестнадцатеричном представлении a a Экранированная последовательность \Uhhhh... состоит ровно из восьми ше стнадцатеричных цифр (h). Последовательности \u и \U могут использо ваться только в литералах строк символов Юникода. \xhh Шестнадцатеричное значение \ooo Восьмеричное значение \0 Символ Null (не признак конца строки) \другое Не является экранированной последовательностью (символ обратного слеша сохраняется) 184 Глава 7. Строки Python вообще нет символа, который служил бы признаком заверше ния строки. Ниже приводится строка, полностью состоящая из экра нированных кодов, – двоичные значения 1 и 2 (записано в восьмерич ной форме), за которыми следует двоичное значение 3 (записано в ше стнадцатеричной форме): >>> s = '\001\002\x03' >>> s '\x01\x02\x03' >>> len(s) 3 Это обстоятельство приобретает особую важность, когда возникает не обходимость обрабатывать на языке Python файлы с двоичными дан ными. Поскольку содержимое таких файлов в сценариях на языке Py thon представлено строками, вы без труда сможете обрабатывать дво ичные файлы, содержащие байты с любыми двоичными значениями (подробнее о файлах рассказывается в главе 9). 1 Наконец, последняя строка в табл. 7.2 предполагает, что если интер претатор не распознает символ после \ как корректный служебный символ, он просто оставляет символ обратного слеша в строке: >>> x = "C:\py\code" # Символ \ сохраняется в строке >>> x 'C:\\py\\code' >>> len(x) 10 Однако если вы не способны держать в памяти всю табл. 7.2, вам не следует полагаться на описанное последней строкой таблицы поведе ние. 2 Чтобы явно добавить символ обратного слеша в строку, нужно указать два символа обратного слеша, идущие подряд (\\ – экраниро ванный вариант представления символа \), или использовать нефор матированные строки, которые описываются в следующем разделе. Неформатированные строки подавляют экранирование Как было показано, экранированные последовательности удобно ис пользовать для вставки в строки служебных символов. Однако иногда зарезервированная экранированная последовательность может поро 1 Если вам требуется работать с файлами, содержащими двоичные данные, главное отличие в работе с ними заключается в том, что открывать их нуж но в режиме двоичного доступа (добавляя к флагу режима открытия флаг b , например "rb" , "wb" и т. д.). Кроме того, обратите внимание на модуль struct , который будет описан в главе 9, с помощью которого можно выпол нять интерпретацию двоичных данных, загруженных из файла. 2 Мне доводилось встречать людей, которые помнили всю таблицу или боль шую ее часть. Я бы счел их ненормальными, но пришлось бы себя вклю чить в их число. Литералы строк 185 ждать неприятности. Очень часто, например, можно увидеть, как на чинающие программисты пытаются открыть файл, передавая аргу мент с именем файла, который имеет примерно следующий вид: 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') Сам интерпретатор Python в определенных случаях использует удваи вание обратного слеша при выводе строк, содержащих обратный слеш: >>> path = r'C:\new\text.dat' >>> path # Показать, как интерпретатор представляет эту строку 'C:\\new\\text.dat' >>> print path # Более дружественный формат представления C:\new\text.dat >>> len(path) # Длина строки 15 Так же как и в случае с числами, при выводе результатов в интерак тивной оболочке по умолчанию используется такой формат представ ления, как если бы это был программный код, отсюда и экранирова ние символов обратного слеша. Чтобы проверить, что дело обстоит именно так, можно проверить результат с помощью встроенной функ ции len, которая возвращает число байтов в строке независимо от фор мата отображения. Если посчитать символы в выводе инструкции print path, можно увидеть, что каждому символу обратно слеша соот ветствует один байт, а всего строка содержит 15 символов. Помимо хранения имен каталогов в Windows неформатированные стро ки обычно используются для регулярных выражений (возможность по иска по шаблону, поддерживаемая модулем re, о котором говорилось 186 Глава 7. Строки в главе 4). Кроме того, следует отметить, что в сценариях на языке Py thon в строках с именами каталогов в системах Windows и UNIX можно использовать простые символы слеша, потому что Python старается поддерживать переносимость для путей к файлам. И все же, когда для кодирования имен каталогов в Windows используется традиционная нотация с обратными слешами, удобно использовать неформатирован ные строки. Тройные кавычки, многострочные блоки текста К настоящему моменту мы познакомились с кавычками, апострофа ми, экранированными последовательностями и неформатированными строками. Кроме этого в арсенале языка Python имеется формат пред ставления строковых литералов, в котором используются тройные ка вычки. Этот формат иногда называют блочной строкой, которую удоб но использовать для определения многострочных блоков текста в про граммном коде. Литералы в этой форме начинаются с трех идущих подряд кавычек (или апострофов), за которыми может следовать про извольное число строк текста, который закрывается такими же тремя кавычками. Внутри такой строки могут присутствовать и кавычки, и апострофы, но экранировать их не требуется – строка не считается завершенной, пока интерпретатор не встретит три неэкранированные кавычки того же типа, которые начинают литерал. Например: >>> mantra = """Always look ... on the bright ... side of life.""" >>> >>> mantra 'Always look\n on the bright\nside of life.' Эта строка состоит из трех строк (в некоторых системах строка пригла шения к вводу изменяется на ..., когда ввод продолжается на следую щей линии; среда IDLE просто переводит курсор на следующую линию). Интерпретатор собирает блок текста, заключенный в тройные кавычки, в одну строку, добавляя символы новой строки (\n) там, где в программ ном коде выполнялся переход на новую строку. Обратите внимание, что в результате у второй строки имеется ведущий пробел, а у третьей – нет, то есть что вы в действительности вводите, то и получаете. Строки в тройных кавычках удобно использовать, когда в программе требуется ввести многострочный текст, например, чтобы определить многострочный текст сообщения об ошибке или код разметки на язы ке HTML или XML. Вы можете встраивать такие блоки текста прямо в свои сценарии, не используя для этого внешние текстовые файлы или явную операцию конкатенации и символы новой строки. Часто строки в тройных кавычках используются для создания строк документирования, которые являются литералами строк, восприни маемыми как комментарии при появлении их в определенных местах Литералы строк 187 сценария (подробнее о них будет рассказываться позже в этой книге). Комментарии не обязательно (но часто!) представляют собой много строчный текст, и данный формат дает возможность вводить много строчные комментарии. Наконец, иногда тройные кавычки являются ужасающим, хакерским способом временного отключения строк программного кода во время разработки (Хорошо, хорошо! На самом деле это не так ужасно, и в дей ствительности довольно распространенная практика). Если вам потре буется отключить несколько строк программного кода и запустить сценарий снова, просто вставьте по три кавычки до и после нужного блока кода, как показано ниже: X = 1 """ import os print os.getcwd() """ Y = 2 Я назвал этот прием ужасным, потому что при работе интерпретатор вынужден создавать строку из таких линий программного кода, но, скорее всего, это слабо сказывается на производительности. В случае крупных блоков программного кода использовать этот прием гораздо удобнее, чем вставлять символы решетки в начале каждой строки, а затем убирать их. Это особенно верно, если используемый вами тек стовый редактор не поддерживает возможность редактирования ис ходных текстов на языке Python. При программировании на этом язы ке практичность часто берет верх над эстетичностью. Строки символов Юникода позволяют использовать крупные наборы символов Последний способ создания строк в сценариях является, пожалуй, са мым специфичным, и он редко используется за пределами задач обра ботки кода разметки XML и вебпрограммирования. Строки символов Юникода иногда называют строками «широких» символов. Так как символы Юникода могут быть представлены более чем одним байтом, такие строки могут обеспечить представление более широкого набора символов, чем стандартные строки. Строки символов Юникода обычно используются с целью поддержки интернационализации приложений (иногда называется как «i18n», чтобы сжать 18 символов, расположенные между первым и последним символом в слове «internationalization»). Например, они позволяют программистам непосредственно использовать в сценариях символы из европейских и азиатских алфавитов. Поскольку такие наборы мо гут содержать больше символов, чем можно представить с помощью однобайтовой кодировки, то для обработки таких видов текста обычно используется Юникод. |