Лутц М. - Изучаем Python (1077325), страница 45
Текст из файла (страница 45)
27 ( Х05, 2Г ) В+06. 17' Х (х, х, х) '1. 23 ~ 01. 23 ) +001. 2' »> "Хв" Х х, втг(х) ('1.23456789', '1 23456789') Форматирование строк из словаря Операция форматирования позволяет также использовать в спецификаторах формата ключи словаря, который указывается в правой части выражения, для извлечения соответствующих значений. Мы пока немного говорили о словарях, поэтому следующий пример демонстрирует самый простой случай: »> "Х(п)О Х(х)з" Х ("и"; 1, "х":"враз") 1 зраа' В данном случае (и) и (х) в строке формата ссылаются на ключи в словаре в правой части выражения и служат для извлечения соответствующих им значений. Этот прием часто используется в программах, создающих код разметки НТМХ или ХМ4., — вы можете построить словарь значений и затем подставить их все одним выражением форматирования, которое использует ключи: »> гер1у = """ Вгеет1пцз...
Не11о Х(паве)з! уоог аце вцоагес 1в Х(аце)в »> ча1оев = ('паее", 'ВоЬ', 'аце". 40) »> рг1пт гер1у Х ча1оез 0гееттпцз... Не1!о ВоЬ.' Уопг аце зциагес тв 40 Этот способ также часто используется в комбинации со встроенной функцией ча гз, которая возвращает словарь, содержащий все переменные, существующие на момент ее вызова: »> Гооа = 'враз' »> аце = 40 Глава 1. Строки »> чагв() ('терс'; 'враз', 'асе': 40, ...и еае мисмесгас других... Если применить эту функцию в правой части оператора форматирования, можно отформатировать значения, обращаясь к ним по именам переменных (то есть по ключам словаря): »> "Х(азв)а Х(твоа)в" Х чагв() '40 враз' Словари во всех подробностях мы будем изучать в главе 8. А в главе 5 вы найдете примеры использования спецификаторов%к и %0 для преобразования значений в шестнадцатеричное и восьмеричное строковое представление.
Строковые методы В дополнение к операторам выражений строки предоставляют набор методов, реализующих более сложные операции обработки текста, Методы — это простые функции, которые связаны с определенными объектами. Формально они являются атрибутами, присоединенными к объектам, которые ссылаются на функции. В языке Ру1)топ методы являютея специфичными для типов объектов: строковые методы, например, работают только с строковыми объектами. Если говорить более точно, функции — это пакеты программного кода, а вызовы методов объединяют в себе выполнение двух операций (извлечение атрибута и вызов функции). Извлечение атрибута Выражение в форме оЬ~есп агтгтсоге означает: «извлечь значение атрибута атттЬоте из объекта сЬ)ест». Вьсзов функции Выражение в форме Еопст)сп(агдоввпта) означает: «вызвать программный код функции гипс т) сп, передав ему ноль или более объектов-аргументов, разделенных запятыми, и вернуть значение функции».
Объединение этих двух действий позволяет вызвать метод объекта. Выражение вызова метода оЬ) еск ве( Ьоб(агдоеепта) вычисляется слева направо, то есть интерпретатор сначала извлекает метод объекта, а затем вызывает его, передавая ему входные аргументы, Если метод возвращает какой-либо результат, он становится результатом всего выражения вызова метода. Как будет много раз показано в этой части книги, большинство объектов обладает методами, которые можно вызвать, и все они доступны с использованием одного и того же синтаксиса вызова метода. Чтобы вызвать метод объекта, вам потребуется существующий объект.
Давайте перейдем к рассмотрению некоторых примеров. 205 Строковые методы Примеры использования строковых методов: изменение строк В табл. 7.4 приводятся шаблоны вызова встроенных строковых методов (более полный и обновленный перечень методов вы найдете в руководстве по стандартной библиотеке языка РуФ]аоп или воспользовавшись функцией Пе1р в интерактивной оболочке, передав ей любую строку). Строковые методы, представленные в этой таблице, реализуют высокоуровневые операции, такие как разбиение и слияние, преобразование регистра символов, проверка типа содержимого и поиск подстроки.
Таблица 7.4. Строггавые методы 8,сарма11гв() 8.свпввг(п1С1П) 8. 1]ов((х!ОГП) 8. 1охег() 8 оопп)(впь [, вгагг [, впс]]) 8.15(тр() 3.овсова([епсоо)пд [.аггогв]]) 8.гвр1аса(о)Э, пвп [, аахвР1Ы]) 3 апов„),П(во((1х [, , а. [, епсв 8 >пэ(воь [ а [ е"]]) Теперь давайте поработаем над программным кодом, который демонстрирует некоторые наиболее часто используемые методы в действии и попутно иллюстрирует основные приемы обработки текста, применяемые в языке РуФ])оп. Как уже говорилось ранее, строки являются неизменяемыми объектами, поэтому их невозможно изменить непосредственно.
Чтобы иэ существующей строки сконструировать новое текстовое значение, необходимо создать новую строку с помощью таких операций, как извлечение подстроки и конкатенация. Например, чтобы изменить два символа в середине строки, можно использовать такой способ: »> 8 'враээу' »> 3 3[:3] + 'хх' + 8[3:] 8 вхрапсгаьв([гаьвыв]) 8.(1пс(воь [, вгаг1 [, апс]]) 3.)поех(воо [, 5(аг( [, впо]]) 8. )ва1поэ() 3.1ва1РПа() 3,>вагди() 3,15)о>гаг() 8.>вврасе() 8,15гм15() 8.155РРаг() 8 1015(ввп) 3.ггпоах(воЬ [, 5(аг( [. апо]]) 8.г]овх(эхо(П) 8,га(г[Р() 8 во1[г([вер [,эахвР!ы ]]) 3,5Р1Ы11пев([кверепов]) 3.втагввю ЬП(рге(хх [, вваг( [, впав]]) 8.5(г[Р() 3.вэарсаве() 3.гм)в() 8.(гапв1а(е((ао15 [, С51спагв]) 3.оррвг() 20б Глава 7, Строки >» 3 зсдХХУ При этом, если требуется только заменить подстроку, можно восполь- зоваться методом гер1асе: »> 8 = 'араазу' »> 8 = з.гар1аоа('аа, 'хх') »> 8 'зрахху' Метод гер1асе является более универсальным, чем предполагает этот программный код.
Он принимает в качестве аргумента оригинальную подстроку (любой длины) и строку (любой длины) замены и выполняет глобальный поиск с заменой: »> 'ааЗЬЬЗссЗОО'.гар1аса('3', '3РАИ') 'аазРАМЬЬЗРАМссзРАМСО' В этой роли метод гер1асе может использоваться как инструмент реализации поиска с заменой по шаблону (например, замены символов формата). Обратите внимание, что на этот раз мы просто выводим результат на экран, а не присваиваем его переменной — присваивать результат переменной необходимо только в том случае, если потребуется сохранить результат дальнейшего использования. Если необходимо заменить одну подстроку фиксированного размера, которая может появиться в любом месте, можно также выполнить операцию замены или отыскать подстроку с помощью метода Г[пс и затем воспользоваться операциями извлечения подстроки: »> 3 = 'ххххзРАМххххзРАМхххх' »> злата = 8.41пс('ЗРАМ') »> илеге 4 »> 3 = 3[:ипага) 4 'Е668' + 3[(ипата+4): 1 »> 3 'ххххЕ668ххххзРАМхххх' Ф Поиск позиции 4 Подстрока найдена со сиеаениеи 4 Метод Гтпс возвращает смещение, по которому найдена подстрока (по умолчанию поиск начинается с начала строки), или значение -1, если искомая подстрока не найдена.
Другой вариант использования метода гер1асе заключается в передаче третьего аргумента, который определяет число производимых замен: »> 3 = 'ххххзРАИххххзРАИхххх' »> 3, гар1аса('8РАИ', 'Е668') 4 Эаиенить все найденние подстроки 'ххххЕ663ххххЕ663хххх' »> з.гар1аса('8РАИ', 'Е663', 1) 4 Заиенить одну подстроку 'хххх(663ххххзРАМхххх' Обратите внимание: метод гер1асе возвращает новую строку. Так как строки являются неизменяемыми, методы никогда в действительно- гоу Строковые методы сти не изменяют оригинальную строку, даже если они называются » гер1асе» (заменить)! »> 8 = 'зрааау' »> [ = )(вт(8) »> ['в', 'р', 'а', 'э', 'а', 'у'] Встроенная функция 1твт (или функция-конструктор объекта) создает новый список из элементов любой последовательности — в данном случае»разрывая» строку на символы и формируя из них список.
Обладая строкой в таком представлении, можно производить необходимые изменения, не вызывая создания новой копии строки при каждом изменении: »> [[3] = 'х' »> Ц41 = 'х' »> г в 'р', а', 'х', 'х', 'у'] д Этот приеи допустии дпя списков, ио ие дпя строк Если после внесения изменений необходимо выполнить обратное пре- образование (чтобы, например, записать результат в файл), можно ис- пользовать метод ]ото, который»собирает» список обратно в строку: »> 8 = ''.)о[п([) »> 8 'врахху' Метод )о1п на первый взгляд может показаться немного странным.
Так как он является строковым методом (а не методом списка), он вызывается через указание желаемой строки-разделителя. Метод ]ото объединяет строки из списка, вставляя строку-разделитель между элементами списка. В данном случае при получении строки из списка используется пустая строка-разделитель. В более общем случае можно использовать произвольную строку-разделитель: »> '8РАМ'.!о[п(['вдов', 'ваозаде', 'Паз', 'зоват']) 'еддз8РАмзаоваде8РАмпап8РАмтоаж ' Примеры методов строк: разбор текста Еще одна распространенная роль, которую играют методы строк, — это простейший разбор текста, то есть анализ структуры и извлечение подстрок.
Для извлечения подстрок из фиксированных смещений можно использовать прием извлечения срезов: Тот факт, что операция конкатенации и метод гвр1асе всякий раз создают новые строковые объекты, может оказаться недостатком их использования для изменения строк. Если в сценарии производится множество изменений длинных строк, вы можете повысить производительность сценария, преобразовав строку в объект, который допускает внесение изменений: 2ОВ Глава 7. Строки »> 11пе = 'ааа ЬЬЬ ссс' »> со11 = 11пе[0;3] »> со13 = 11пе[3: ] »> со11 'ааа' »> со13 'ссс' В этом примере поля данных располагаются в фиксированных позициях и потому могут быть легко извлечены из оригинальной строки. Этот прием может использоваться, только если анализируемые компоненты располагаются в известных фиксированных позициях. Если для разделения полей используется некоторый разделитель, можно воспользоваться методом разбиения строки на компоненты.