Лутц М. - Изучаем Python (1077325), страница 46
Текст из файла (страница 46)
Этот прием используется, когда искомые данные могут располагаться в произвольных позициях внутри строки: »> 11пе = 'ааа ЬЬЬ ссс' »> со1в = Ипе.вр111() »> со14 ['ааа'. 'ЬЬЬ', ссс'] Строковый метод зр)тт преобразует строку в список подстрок, окружающих строки-разделители. В предыдущем примере мы не указали строку-разделитель, поэтому в данном случае по умолчанию в качестве разделителей принимаются пробельные символы — строка разбивается на группы по символам пробела, табуляции или перевода строки, и в результате мы получили список подстрок. В других случаях данные могут отделяться другими разделителями.
В следующем примере производится разбиение (и, следовательно, разбор) строки по символу запятой, который обычно используется для отделения данных, извлеченных из баз данных: »> 11пе = 'ЬоЬ.ЬасКег,40' »> 11пе,вр111(',') ['ЬоЬ', 'Ьаскег', '40'] Разделители могут содержать более одного символа: »~ 11пе = Га езрааазРАК)оеоег)аск" »> 11пе.вр111("3РАН") ["Ч 'е", 'а', ' 1саЬег)асК'] Хотя оба способа, основанные на извлечении подстрок и разбиении строк, имеют определенные ограничения, они работают достаточно быстро и могут использоваться для разбора текстовой информации в простых случаях.
Другие часто используемые методы строк в действии Другие строковые методы имеют более специфическое предназначение, например, удаляют пробельные символы в конце текстовой строки, вы- 209 Строковые методы полняют преобразование регистра символов, проверяют характер со- держимого строки и проверяют наличие подстроки в конце строки: »> 11пе = "тпе нп1дьтв шпо зу иы 'тп" »> 11пе.гзтг1р() 'ТПЕ НП1ОПТЗ ипс Ву М1!' »> 11пе.цррег() 'ТНЕ КИ!ННТ8 ННО ЯУ И1!ч,п' »> 11пе.1вв1РЬз() Еа1зе »> 11пе,епазм11Ь('И1!'Тп') Тгце Для достижения тех же результатов в некоторых случаях могут использоваться альтернативные приемы — с использованием оператора проверки вхождения тп можно проверить присутствие подстроки, например, а функция получения длины строки и операция извлечения подстроки могут использоваться для имитации действия функции епдзш]Т Кн »> 11пе 'ТПе Кптевтв мво зу Мпч,п' »> 11пе.г1по('и1') 1= -1 Ф поиск с использованием амзова метода или амраиения Тгце »> 'И1' 1п Ыпе Тгце >» вцЬ = 'И1!~п' »> 11пе.епази11ь(зць) д проверка наличия подстроки в конце строки Тгце д с ломошью метода или операции извлечения подстроки »> 11пе(-1еп(вцв):] == вцЬ Тгце Для работы со строками существует достаточно много методов, однако мы не будем рассматривать их все.
Некоторые методы вы увидите далее в этой книге, а за дополнительной информацией вы можете обратиться к руководству по библиотеке языка Ру(]топ и другим источникам информации или просто поэкспериментировать с ними в интерактивном режиме. Обратите внимание: ни один из строковых методов не поддерживает шаблоны, для обработки текста с использованием шаблонов необходимо использовать модуль ге, входящий в состав стандартной библиотеки языка Ру1йоп, — дополнительный инструмент, начальные сведения о котором приводились в главе 4, а полное его обсуждение выходит далеко эа рамки этой книги.
Тем не менее, несмотря на это ограничение, строковые методы иногда оказываются эффективнее, чем функции модуля ге. Оригинальный модуль 91г] л9 История развития строковых методов достаточно запутанна. В течение первого десятилетия существования Ру1йоп в состав стандартной Глава 7, Строки библиотеки входил модуль всгшц, который содержал функции, во многом напоминающие современные строковые методы. В ответ на требования пользователей в версии РуС)топ 2.0 эти функции были преобразованы в методы строковых объектов.
Однако из-за большого объема программного кода, уже написанного к тому времени, оригинальный модуль всгспц был сохранен для обеспечения обратной совместимости. Ныне вы должны использовать не оригинальный модуль вС г( пц, а применять строковые методы. Фактически, как предполагается, оригинальные строковые функции, соответствующие методам, будут убраны нз состава стандартной библиотеки языка РуОтоп в версии З.О, которая должна быть выпущена после выхода в свет этого издания.
Однако, поскольку использование модуля в1г(пц еще можно встретить в старом программном коде, мы коротко рассмотрим его. В версии Ру()топ 2.5 по-прежнему существует два способа использования расширенных операций над строками: посредством вызова методов и вызовом функций модуля вС г(пц, которым в качестве аргумента передается объект строки. Например, допустим, что переменная Х ссылается на объект строки, тогда вызов метода объекта будет выглядеть следующим образом: х.ае1поо(агцоаепсв) что эквивалентно вызову аналогичной функции из модуля в1г(пц (представим, что этот модуль уже был импортирован): втгтпц.аасоос(Х.
агцоаептв) В следующем примере демонстрируется порядок использования метода: »> 3 'ааЬ+о+' »> х = З.гзр)аоа('+', 'зраа') »> х 'авраоовраасвраз' Чтобы выполнить ту же самую операцию с помощью модуля всг! пц, необходимо импортировать модуль (по крайней мере, один раз) и передать функции объект: »> сарогс зсгспд »> у = зсгспд.гар)аоз(3, '+', 'враз') »> аврааЬвраасврао' Поскольку подход, основанный на применении модуля, был стандартом на протяжении многих лет, а строки являются одним из центральных компонентов большинства программ, при анализе существующих программ вам в программном коде наверняка встретятся оба варианта работы со строками. И, тем не менее, при создании новых программ вместо функций устаревшего модуля вы должны использовать строковые методы.
Для это- Общие категории типов го есть и другие серьезные основания помимо того, что многие функции модуля вт ы од будут исключены из состава стандартной библиотеки с выходом РуФЬоп 3.0. Одна из таких причин — схема вызова модуля требует от вас импортировать модуль втг)пд (при использовании строковых методов ничего импортировать не нужно). Другая причина заключается в том, что при использовании функций модуля с клавиатуры приходится вводить на несколько символов больше (когда модуль загружается е использованием инструкции гярогт, а не ггов). И наконец, функции модуля выполняются несколько медленнее, чем методы (в настоящее время функции модуля отображаются на вызовы методов, в результате чего производятся дополнительные вызовы).
Оригинальный модуль втг(пд скорее всего останется в составе РуСЬоп 3.0, потому что в нем присутствуют дополнительные средства работы со строками, включая предопределенные строковые константы и систему шаблонных объектов (которая не описывается в этой книге; за дополнительной информацией обращайтееь к руководству по библиотеке языка РуФ)топ). Если вы не хотите модифицировать свой программный код после выхода версии 3.0, вы должны смотреть на базовые строковые функции как на призраки прошлого. Общие категории типов Теперь, когда мы исследовали строки, первый объект из коллекции языка Ру()топ, сделаем паузу, чтобы дать определение некоторым общим концепциям, применимым к большинству типов, которые будут рассматриваться дальше. Оказывается, что операции над встроенными типами работают одинаково в случае применения их к типам одной категории, поэтому нам необходимо лишь определить эти категории. К настоящему моменту мы исследовали только числа и строки, но так как они относятся к двум из трех основных категорий в языке Ру$)топ, то вы знаете о других типах гораздо больше, чем могли бы подумать.
Типы одной категории имеют общий набор операций Как вы уже знаете, строки представляют собой неизменяемые последовательности: они не могут быть изменены непосредственно (неизменяемые) и являются упорядоченными коллекциями элементов, доступ к которым может осуществляться по величине смещения (поеледовагпельноет и). Оказывается, над последовательностями, которые мы будем рассматривать в этой части книги, могут выполняться те же операции, которые были продемонстрированы в этой главе, — конкатенация, доступ к элементам по индексам, обход элементов в цикле и т.
д. Формально в языке РуФоп существует три категории типов (и операций): Числа Поддерживают операции сложения, умножения и т. д. г1г Глава 7. Строки Последовательности Поддерживают операции индексации, извлечения среза, конкатенации и т. д. Отображения Поддерживают операцию индексации по ключу и т. д. Мы еще не рассматривали подробно отображения (словари обсуждаются в следующей главе), но к другим типам, которые нам встретятся, в основном будут применимы одни и те же операции. Например, для любых объектов последовательностей Х и 1': ° Выражение Х ь '1' создает новый объект последовательности, включающий содержимое обоих операндов. ° Выражение Х * Ч создает новый объект последовательности, включающий й копий операнда Х. Другими словами, эти операции действуют одинаково на любые виды последовательностей, включая строки, списки, кортежи и некоторые типы, определяемые пользователем.
Единственное отличие состоит в том, что результат, возвращаемый выражением, имеет тот же тип, что и операнды Х и У, то есть, если выполняется операция конкатенации списков, то возвращается новый список, а не строка. Операции индексации и извлечения среза одинаково работают для любых последовательностей — тип объекта определяет, какая задача должна быть решена. Изменяемые типы допускают непосредственное изменение Классификация по возможности изменения — это существенное ограничение, чтобы не помнить о нем, и все же она часто сбивает с толку начинающих программистов.
Если объект является неизменяемым типом, вы не сможете изменить его значение непосредственно — в этом случае интерпретатор будет выдавать сообщение об ошибке. Вместо этого необходимо, чтобы программный код создавал новый объект, содержащий новое значение. Вообще неизменяемые типы обеспечивают определенный уровень поддержки целостности, гарантируя, что объект не подвергнется изменениям в другой части программы. Чтобы вспомнить, почему это имеет такое большое значение, вернитесь к дискуссии о разделяемых ссылках на объекты в главе 6. В заключение В этой главе мы подробно рассмотрели строковый тип объектов. Мы узнали о строковых литералах и исследовали операции нэд строками, включая операции над последовательностями, форматирование и методы.