Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 60
Текст из файла (страница 60)
Он принимает в качестве аргумента оригинальную подстроку(любой длины) и строку (любой длины) замены, и выполняет глобальный поискс заменой:>>> ‘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).