справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
Глава 16 . Работа с текстом и строками В этой главе описываются модули Python, наиболее часто используемые для работы со строками и с текстом. В центре внимания этой главы будут наиболее типичные строковые операции, такие как обработка текста, сопо- ставление с шаблонами регулярных выражений и форматирование текста. Модуль codecs Модуль codecs используется для работы с различными кодировками сим- волов, применяемыми при вводе-выводе текста Юникода. Модуль позво- ляет определять новые кодировки символов и обеспечивает возможность обработки символьных данных с применением широкого спектра суще- ствующих кодировок, таких как UTF-8, UTF-16 и других. При разработке приложений намного более типично просто использовать существующие кодировки, поэтому именно эту тему мы и будем обсуждать здесь. Если вам потребуется создавать новые кодировки, за дополнительными подроб- ностями обращайтесь к электронной документации. Низкоуровневый интерфейс модуля codecs Каждой кодировке символов присвоено определенное имя, такое как ‘utf-8’ или ‘big5’. Следующая функция выполняет поиск кодировки. lookup(encoding) Отыскивает кодировку в реестре. В аргументе encoding передается строка, такая как ‘utf-8’. Если искомая кодировка в реестре отсутствует, возбуж- дается исключение LookupError. В противном случае возвращается экзем- пляр с класса CodecInfo. Экземпляр c класса CodecInfo обладает следующими методами: c.encode(s [, errors]) Функция кодирования, которая кодирует строку s Юникода и возвращает кортеж (bytes, length_consumed). Элемент bytes – это строка 8-битных сим- это строка 8-битных сим- строка 8-битных сим- строка 8-битных сим- 8-битных сим- битных сим- сим- сим- 350 Глава 16. Работа с текстом и строками волов, или массив байтов, содержащая кодированные данные. Элемент length_consumed – это число, отражающее количество символов в строке s, которые были кодированы. Необязательный аргумент errors определяет политику обработки ошибок кодирования и по умолчанию имеет значение ‘strict’ c.decode(bytes [, errors]) Функция кодирования, которая декодирует строку байтов bytes и возвра- и возвра- возвра- возвра- щает кортеж (s, length_consumed). Элемент s – это строка Юникода, а length_ consumed – количество байтов в аргументе bytes, которые были декодирова- которые были декодирова- были декодирова- были декодирова- декодирова- декодирова- ны. Необязательный аргумент errors определяет политику обработки оши- бок кодирования и по умолчанию имеет значение ‘strict’. c.streamreader(bytestream [, errors]) Возвращает экземпляр класса StreamReader, который используется для чтения декодированных данных. В аргументе bytestream передается объ- ект, поддерживающий интерфейс файлов, открытый в двоичном режиме. Необязательный аргумент errors определяет политику обработки ошибок кодирования и по умолчанию имеет значение ‘strict’. Экземпляр r клас- са StreamReader поддерживает следующие низкоуровневые операции ввода- вывода: Метод Описание r.read([size [, chars [, firstline]]]) Возвращает последние chars символов декодированного текста. Аргумент size определяет максимальное число байтов, которые могут быть прочитаны из потока байтов, и используется для управления внутренним механизмом буферизации. В аргументе firstline передается флаг. Если он установлен, функция возвращает пер- вую строку текста, даже если далее в фай- ле возникли ошибки декодирования. r.readline([size [, keepends]]) Возвращает одну строку декодированного текста. Флаг keepends определяет, должны ли сохраняться символы завершения стро- ки (по умолчанию имеет значение True ). r.readlines([size [, keepends]]) Читает все строки в список. r.reset() Очищает внутренние буферы и информа- цию о состоянии объекта. c.streamwriter(bytestream [, errors]) Возвращает экземпляр класса StreamWriter, который используется для за- писи кодированных данных. В аргументе bytestream передается объект, поддерживающий интерфейс файлов, открытый в двоичном режиме. Необязательный аргумент errors определяет политику обработки ошибок кодирования и по умолчанию имеет значение ‘strict’. Экземпляр w клас- Модуль codecs 351 са StreamWriter поддерживает следующие низкоуровневые операции ввода- вывода: Метод Описание w.write(s) Выводит кодированное представление строки s. w.writelines(lines) Выводит список строк lines в файл. w.reset() Очищает внутренние буферы и информацию о состоя- нии объекта. c.incrementalencoder([errors]) Возвращает экземпляр класса IncrementalEncoder, который может исполь- зоваться для кодирования строк в несколько этапов. Необязательный ар- гумент errors по умолчанию имеет значение ‘strict’. Экземпляр e класса IncrementalEncoder обладает следующими методами: Метод Описание e.encode(s [,final]) Возвращает кодированное представление строки s в виде строки байтов. Аргумент final должен устанав- ливаться в значение True в последнем вызове метода encode() e.reset() Очищает внутренние буферы и информацию о состоя- нии объекта. c.incrementaldecoder([errors]) Возвращает экземпляр класса IncrementalDecoder, который может использо- ваться для декодирования строк байтов в несколько этапов. Необязатель- ный аргумент errors по умолчанию имеет значение ‘strict’. Экземпляр d класса IncrementalDecoder обладает следующими методами: Метод Описание d.decode(bytes [,final]) Возвращает декодированную строку, представляющую последовательность кодированных байтов bytes. Аргумент final должен устанавливаться в значение True в последнем вызове метода decode(). d.reset() Очищает внутренние буферы и информацию о состоя- нии объекта. Функции ввода-вывода Модуль codecs предоставляет коллекцию высокоуровневых функций, по- зволяющих упростить реализацию операций ввода-вывода кодированного текста. В большинстве случаев программисты предпочитают использовать эти функции вместо низкоуровневого интерфейса модуля codecs, описанно- го в первом разделе. 352 Глава 16. Работа с текстом и строками open(filename, mode[, encoding[, errors[, buffering]]]) Открывает файл filename в режиме mode и обеспечивает прозрачное кодиро- вание/декодирование данных в соответствии с кодировкой, указанной в ар- гументе encoding. В аргументе errors передается одно из значений: ‘strict’, ‘ignore’ , ‘replace’, ‘backslashreplace’ или ‘xmlcharrefreplace’. По умолчанию используется значение ‘strict’. Аргумент buffering имеет то же назначение, что и одноименный аргумент встроенной функции open(). Независимо от режима, указанного в аргументе mode, файл всегда открывается в двоич- ном режиме. В Python 3 вместо функции codecs.open() можно использовать встроенную функцию open(). EncodedFile(file, inputenc[, outputenc [, errors]]) Класс, представляющий собой обертку вокруг существующего объекта файла file, выполняющую кодирование. Перед записью в файл данные сначала интерпретируются в соответствии с кодировкой inputenc, а затем записываются в файл с использованием кодировки outputenc. Декодиро- вание данных, прочитанных из файла, выполняется в соответствии с ко- дировкой inputenc. Если аргумент outputenc опущен, он по умолчанию по- опущен, он по умолчанию по- , он по умолчанию по- он по умолчанию по- по умолчанию по- по умолчанию по- умолчанию по- умолчанию по- по- по- лучает значение inputenc. Аргумент errors имеет то же назначение, что и в функции open(), и по умолчанию имеет значение ‘strict’. iterencode(iterable, encoding [, errors]) Функция-генератор, которая последовательно кодирует все строки в объ- екте iterable в соответствии с кодировкой encoding. Аргумент errors по умолчанию имеет значение ‘strict’. iterdecode(iterable, encoding [, errors]) Функция-генератор, которая последовательно декодирует все строки бай- тов в объекте iterable в соответствии с кодировкой encoding. Аргумент er- rors по умолчанию имеет значение ‘strict’. Полезные константы Модуль codecs определяет следующие константы маркеров порядка следо- вания байтов, которые могут использоваться как вспомогательное сред- ство в интерпретации файлов, когда кодировка данных заранее не извест- на. Иногда эти маркеры записываются в начало файла, чтобы обозначить кодировку символов, и могут использоваться для выбора соответствующей кодировки. Константа Описание BOM Порядок следования байтов определяется аппаратной архитектурой (BOM_BE или BOM_LE) BOM_BE Маркер прямого (big-endian) порядка следования байтов ( ‘\xfe\xff’ ) BOM_LE Маркер обратного (little-endian) порядка следования байтов (‘\xff\xfe’) BOM_UTF8 Маркер кодировки UTF-8 (‘\xef\xbb\xbf’) Модуль codecs 353 Константа Описание BOM_UTF16_BE М аркер прямого (big-endian) порядка следования байтов в 16-битовой кодировке UTF-16 (‘\xfe\xff’) BOM_UTF16_LE Маркер обратного (little-endian) порядка следования байтов в 16-битовой кодировке UTF-16 (‘\xfe\xff’) BOM_UTF32_BE Маркер прямого (big-endian) порядка следования байтов в 32-битовой кодировке UTF-32 (‘\x00\x00\xfe\xff’) BOM_UTF32_LE Маркер обратного (little-endian) порядка следования бай- little-endian) порядка следования бай- -endian) порядка следования бай- endian) порядка следования бай- ) порядка следования бай- тов в 32-битовой кодировке UTF-32 (‘\xff\xfe\x00\x00’) Стандартные кодировки Ниже приводится список некоторых из наиболее часто используемых ко- дировок символов. Имена кодировок приводятся в том виде, в каком они передаются функциям, таким как open() или lookup(). Полный список мож- но найти в электронной документации с описанием модуля codecs (http:// docs.python.org/library/codecs ). Название кодировки Описание ascii 7-битная кодировка ASCII cp437 Расширенный набор символов ASCII из MS-DOS cp1252 Расширенный набор символов ASCII из Windows latin-1, iso-8859-1 Набор ASCII, дополненный символами из набора Latin utf-16 UTF-16 utf-16-be UTF-16 с прямым порядком следования байтов utf-16-le UTF-16 с обратным порядком следования байтов utf-32 UTF-32 utf-32-be UTF-32 с прямым порядком следования байтов utf-32-le UTF-32 с обратным порядком следования байтов utf-8 UTF-8 Примечания • Дополнительные сведения об использовании модуля codecs приводятся в главе 9 «Ввод и вывод». • Информацию о том, как создавать новые кодировки символов, можно найти в электронной документации. • Особое внимание требуется уделять входным аргументам операций en- code() и decode(). Всем операциям encode() должны передаваться строки Юникода, а всем операциям decode() – строки байтов. В Python 2 это требование соблюдается не так строго, но в Python 3 различия между типами строк имеют существенное значение. Например, в Python 2 име- Python 2 име- 2 име- 354 Глава 16. Работа с текстом и строками ются кодировки, которые отображают строки байтов в строки байтов (например, кодировка «bz2»). Они недоступны в Python 3 и потому не должны использоваться, если вы учитываете задачу совместимости. Модуль re Модуль re используется для выполнения операций сопоставления с шаб- лонами регулярных выражений и замены фрагментов строк. Модуль под- держивает операции как со строками Юникода, так и со строками байтов. Шаблоны регулярных выражений определяются как строки, состоящие из смеси текста и последовательностей специальных символов. В шаблонах часто используются специальные символы и символ обратного слэша, по- этому они обычно оформляются, как «сырые» строки, такие как r’(?P d+)\.(\d*)’ . В оставшейся части этого раздела все шаблоны регулярных вы- ражений будут записываться с использованием синтаксиса «сырых» строк. Синтаксис шаблонов Ниже приводится список последовательностей специальных символов, ко- торые используются в шаблонах регулярных выражений: Символ(ы) Описание text Соответствует строке text. Соответствует любому символу, кроме символа перевода строки. ^ Соответствует позиции начала строки. $ Соответствует позиции конца строки. * Ноль или более повторений предшествующего выражения; соответствует максимально возможному числу повторений. + Одно или более повторений предшествующего выражения; соответствует максимально возможному числу повторений. ? Ноль или одно повторение предшествующего выражения. *? Ноль или более повторений предшествующего выражения; соответствует минимально возможному числу повторений. +? Одно или более повторений предшествующего выражения; соответствует минимально возможному числу повторений. ?? Ноль или одно повторение предшествующего выражения; соответствует минимально возможному числу повторений. {m} Соответствует точно m повторениям предшествующего вы- ражения. {m, n} Соответствует от m до n повторений предшествующего выра- жения. Если аргумент m опущен, он принимается равным 0 . Если аргумент n опущен, он принимается равным бес- бес- бес- конечности. Модуль re 355 Символ(ы) Описание {m, n}? От m до n повторений предшествующего выражения; соот- ветствует минимально возможному числу повторений. [...] Соответствует любому символу, присутствующему в мно- жестве, таком как r’[abcdef]’ или r’[a-zA-z]’. Специальные символы, такие как *, утрачивают свое специальное значе- ние внутри множества. [^...] Соответствует любому символу, не присутствующему в множестве, таком как r’[^0-9]’. A|B Соответствует либо A, либо B, где A и B являются регулярны- ми выражениями. (...) Подстрока, соответствующая регулярному выражению в круглых скобках, интерпретируется как группа и сохра- няется. Содержимое группы может быть получено с помо- щью метода group() объектов класса MatchObject , которые возвращаются операцией поиска совпадений. (?aiLmsux) Символы “a”, “i”, “L”, “m”, “s”, “u” и “x” интерпретируются как флаги, соответствующие флагам re.A, re.I, re.L, re.M, re.S , re.U, re.X, которые передаются методу re.compile() Флаг “a” доступен только в Python 3. (?:...) Соответствует регулярному выражению в круглых скоб- ках, но совпавшая подстрока не сохраняется. (?P< name>...) Подстрока, соответствующая регулярному выражению в круглых скобках, интерпретируется как именованная группа с именем name. Имя группы должно быть допусти- мым идентификатором Python. (?P= name...) Соответствует тому тексту, который ранее уже совпал с именованной группой name. (?#...) Комментарий. Содержимое в круглых скобках игнориру- ется. (?=...) Соответствует предшествующему выражению, только если вслед за ним обнаруживается совпадение с шабло- ном в круг лых скобках. Например, выражение r’Hello (?=World)’ совпадет с подстрокой ‘Hello ‘, только если за ней будет следовать подстрока ‘World’. (?!...) Соответствует предшествующему выражению, только если вслед за ним отсутствует совпадение с шаблоном в круглых скобках. Например, выражение r’Hello (?!World)’ совпадет с подстрокой ‘Hello ‘ , только если за ней не будет следо- вать подстрока ‘World’. (?<=...) Соответствует следующему выражению, только если перед ним обнаруживается совпадение с шаблоном в круглых скобках. Например, выражение r’(?<=abc)def’ совпадет с подстрокой ‘def’, только если ей будет предшествовать подстрока ‘abc’. 356 Глава 16. Работа с текстом и строками Символ(ы) Описание (? Соответствует следующему выражению, только если перед ним отсутствует совпадение с шаблоном в круглых скоб- ках. Например, выражение r’(? строкой ‘def’, только если ей не будет предшествовать под- строка ‘abc’. (?( id|name)ypat|npat) Проверяет, существует ли группа регулярного выражения с числовым идентификатором id или с именем name. Если такая группа существует, определяется соответствие регу- лярному выражению ypat. В противном случае определяет- ся соответствие необязательному регулярному выражению npat . Например, выражение r’(Hello)?(?(1) World|Howdy)’ сов- падет со строкой ‘Hello World’ или со строкой ‘Howdy’. Стандартные экранированные последовательности, такие как ‘\n’ и ‘\t’, точно так же интерпретируются и в регулярных выражениях (например, выражению r’\n+’ будет соответствовать один или более символов перевода строки). Кроме того, литералы символов, которые в регулярных выраже- ниях имеют специальное значение, можно указывать, предваряя их симво- лом обратного слэша. Например, выражению r’\*’ соответствует символ *. Дополнительно ряд экранированных последовательностей, начинающих- ся символом обратного слэша, соответствуют специальным символам: Символ(ы) Описание \ число Соответствует фрагменту текста, совпавшему с группой с указанным номером. Группы нумеруются от 1 до 99, слева направо. \A Соответствует только началу строки. \b Соответствует пустой строке в позиции начала или конца слова. Под словом подразумевается последовательность алфавитно-цифровых символов, завершающаяся пробель- ным или любым другим не алфавитно-цифровым символом. \B Соответствует пустой строке не в позиции начала или кон- ца слова. \d Соответствует любой десятичной цифре. То же, что и вы- ражение r’[0-9]’. \D Соответствует любому нецифровому символу. То же, что и выражение r’[^0-9]’. \s Соответствует любому пробельному символу. То же, что и выражение r’[\t\n\r\f\v]’. \S Соответствует любому непробельному символу. То же, что и выражение r’[^\t\n\r\f\v]’. \w Соответствует любому алфавитно-цифровому символу. (продолжение) |