М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 59
Текст из файла (страница 59)
Он принимает в качестве аргумента оригинальную подстроку(любой длины) и строку (любой длины) замены, и выполняет глобальный поискс заменой:>>> ‘aa$bb$cc$dd’.replace(‘$’, ‘SPAM’)‘aaSPAMbbSPAMccSPAMdd’В этой роли метод replace может использоваться как инструмент реализациипоиска с заменой по шаблону (например, замены символов формата).
Обратитевнимание, что на этот раз мы просто выводим результат на экран, а не присваиваем его переменной – присваивать результат переменной необходимо тольков том случае, если потребуется сохранить результат дальнейшего использования.Если необходимо заменить одну подстроку фиксированного размера, котораяможет появиться в любом месте, можно также выполнить операцию заменыили отыскать подстроку с помощью метода find и затем воспользоваться операциями извлечения подстроки:>>> S = ‘xxxxSPAMxxxxSPAMxxxx’>>> where = S.find(‘SPAM’)# Поиск позиции>>> where# Подстрока найдена со смещением 44>>> S = S[:where] + ‘EGGS’ + S[(where+4):]>>> S‘xxxxEGGSxxxxSPAMxxxx’230Глава 7.
СтрокиМетод find возвращает смещение, по которому найдена подстрока (по умолчанию поиск начинается с начала строки), или значение -1, если искомая подстрока не найдена. Другой вариант использования метода replace заключаетсяв передаче третьего аргумента, который определяет число производимых замен:>>> S = ‘xxxxSPAMxxxxSPAMxxxx’>>> S.replace(‘SPAM’, ‘EGGS’)‘xxxxEGGSxxxxEGGSxxxx’>>> S.replace(‘SPAM’, ‘EGGS’, 1)‘xxxxEGGSxxxxSPAMxxxx’# Заменить все найденные подстроки# Заменить одну подстрокуОбратите внимание: метод replace возвращает новую строку.
Так как строкиявляются неизменяемыми, методы никогда в действительности не изменяюторигинальную строку, даже если они называются «replace» (заменить)!Тот факт, что операция конкатенации и метод replace всякий раз создают новые строковые объекты, может оказаться недостатком их использования дляизменения строк. Если в сценарии производится множество изменений длинных строк, вы можете повысить производительность сценария, преобразовавстроку в объект, который допускает внесение изменений:>>> S = ‘spammy’>>> L = list(S)>>> L[‘s’, ‘p’, ‘a’, ‘m’, ‘m’, ‘y’]Встроенная функция 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’Строковые методы231На практике объединение подстрок в одну строку часто выполняется намногобыстрее, чем последовательность операций конкатенации отдельных элементов списка.
Обратите также внимание на упоминавшийся выше строковый типbytearray, появившийся в версиях Python������������������������������������������������������������������������������ 3.0 и 2.6, который полностью описывается в главе 36, – благодаря тому, что объекты этого типа могут изменятьсянепосредственно, в некоторых случаях он представляет отличную альтернативу комбинации функций list/join, особенно когда текст приходится изменятьдостаточно часто.Примеры методов строк: разбор текстаЕще одна распространенная роль, которую играют методы строк, – это простейший разбор текста, то есть анализ структуры и извлечение подстрок. Дляизвлечения подстрок из фиксированных смещений можно использовать приемизвлечения срезов:>>> line = ‘aaa bbb ccc’>>> col1 = line[0:3]>>> col3 = line[8:]>>> col1‘aaa’>>> col3‘ccc’В этом примере поля данных располагаются в фиксированных позициях и потому могут быть легко извлечены из оригинальной строки.
Этот прием можетиспользоваться, только если анализируемые компоненты располагаются в известных фиксированных позициях. Если поля отделяются друг от друга некоторым разделителем, можно воспользоваться методом разбиения строки накомпоненты. Этот прием используется, когда искомые данные могут располагаться в произвольных позициях внутри строки:>>> line = ‘aaa bbb ccc’>>> cols = line.split()>>> cols[‘aaa’, ‘bbb’, ‘ccc’]Строковый метод split преобразует строку в список подстрок, окружающих строки-разделители. В предыдущем примере мы не указали строкуразделитель, поэтому по умолчанию в качестве разделителей используютсяпробельные символы – строка разбивается на группы по символам пробела,табуляции или перевода строки, и в результате мы получили список подстрок.В других случаях данные могут отделяться другими разделителями.
В следующем примере производится разбиение (и, следовательно, разбор) строки посимволу запятой, который обычно используется для отделения данных, извлеченных из баз данных:>>> line = ‘bob,hacker,40’>>> line.split(‘,’)[‘bob’, ‘hacker’, ‘40’]Разделители могут содержать более одного символа:>>> line = “i’mSPAMaSPAMlumberjack”>>> line.split(“SPAM”)[“i’m”, ‘a’, ‘lumberjack’]232Глава 7. СтрокиХотя оба способа, основанные на извлечении подстрок и разбиении строк, имеют определенные ограничения, они работают достаточно быстро и могут использоваться для разбора текстовой информации в простых случаях.Другие часто используемые методы строк в действииДругие строковые методы имеют более специфическое предназначение, например удаляют пробельные символы в конце текстовой строки, выполняютпреобразование регистра символов, проверяют характер содержимого строкии проверяют наличие подстроки в конце строки или в начале:>>> line = “The knights who say Ni!\n”>>> line.rstrip()‘The knights who say Ni!’>>> line.upper()‘THE KNIGHTS WHO SAY NI!\n’>>> line.isalpha()False>>> line.endswith(‘Ni!\n’)True>>> line.startswith(‘The’)TrueДля достижения тех же результатов в некоторых случаях могут использоваться альтернативные приемы – с использованием оператора проверки вхождения in можно проверить присутствие подстроки, а функция получения длиныстроки и операция извлечения подстроки могут использоваться для имитациидействия функции endswith:>>> line‘The knights who say Ni!\n’>>> line.find(‘Ni’) != -1 # Поиск с использованием вызова метода или выраженияTrue>>> ‘Ni’ in lineTrue>>> sub = ‘Ni!\n’>>> line.endswith(sub)# Проверка наличия подстроки в конце строкиTrue# с помощью метода или операции извлечения подстроки>>> line[-len(sub):] == subTrueОбратите также внимание на строковый метод format, который описываетсяниже в этой главе, – он позволяет реализовать более сложные способы подстановки в одной инструкции, чем комбинирование нескольких операций.Для работы со строками существует достаточно много методов, поэтому мы небудем рассматривать их все.
Некоторые методы вы увидите далее в этой книге,а за дополнительной информацией вы можете обратиться к руководству по библиотеке языка Python и другим источникам информации или просто поэкспериментировать с ними в интерактивном режиме. Кроме того, можно изучитьрезультат вызова функции help(S.method), чтобы познакомиться с описаниемметода method для любого объекта строки S.Обратите внимание, что ни один из строковых методов не поддерживает шаблоны, – для обработки текста с использованием шаблонов необходимо использо-Строковые методы233вать модуль re, входящий в состав стандартной библиотеки языка Python, – дополнительный инструмент, начальные сведения о котором приводились в главе 4, а полное его обсуждение выходит далеко за рамки этой книги (один пример приводится в конце главы 36). Тем не менее, несмотря на это ограничение,строковые методы иногда оказываются эффективнее, чем функции модуля re.Оригинальный модуль string (был убран в версии 3.0)История развития строковых методов достаточно запутана.
В течение первого десятилетия существования Python в состав стандартной библиотеки входил модуль string, который содержал функции, во многом напоминающие современные строковые методы. В ответ на требования пользователей в версииPython 2.0 эти функции были преобразованы в методы строковых объектов.Однако, из-за большого объема программного кода, уже написанного к томувремени, оригинальный модуль string был сохранен для обеспечения обратнойсовместимости.Ныне вы должны использовать не оригинальный модуль string, а применятьтолько строковые методы. Фактически, как предполагается, оригинальныестроковые функции, соответствующие методам, были полностью убраны из состава стандартной библиотеки языка Python в версии 3.0. Однако, посколькуиспользование модуля string еще можно встретить в старом программном коде,мы коротко рассмотрим его.В версии Python 2.6 по-прежнему существует два способа использования расширенных операций над строками: посредством вызова методов и вызовомфункций модуля string, которым в качестве аргумента передается объект строки.
Например, допустим, что переменная X ссылается на объект строки, тогдавызов метода объекта будет выглядеть следующим образом:X.method(arguments)что эквивалентно вызову аналогичной функции из модуля string (представим,что этот модуль уже был импортирован):string.method(X, arguments)В следующем примере демонстрируется порядок использования метода:>>> S = ‘a+b+c+’>>> x = S.replace(‘+’, ‘spam’)>>> x‘aspambspamcspam’Чтобы выполнить ту же самую операцию с помощью модуля string, необходимоимпортировать модуль (по крайней мере, один раз) и передать функции объект:>>> import string>>> y = string.replace(S, ‘+’, ‘spam’)>>> y‘aspambspamcspam’Поскольку подход, основанный на применении модуля, был стандартом на протяжении многих лет, а строки являются одним из центральных компонентовбольшинства программ, при анализе существующих программ вам навернякавстретятся оба варианта работы со строками.234Глава 7.