Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 16910 / 520 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 6:

Обработка текстов. Регулярные выражения. Unicode

Аннотация: В этой лекции дается краткое представление о возможностях языка Python по обработке текстовой информации. Рассмотрены синтаксис и семантика регулярных выражений, а также некоторые вопросы использования Unicode.

Под обработкой текстов понимается анализ, преобразование, поиск, порождение текстовой информации. По большей части работа с естественными текстами не будет глубже, чем это возможно без систем искусственного интеллекта. Кроме того, здесь предполагается опустить рассмотрение обработки текстов посредством текстовых процессоров и редакторов, хотя некоторые из них (например, Cooledit) предоставляют возможность писать макрокоманды на Python.

Следует отметить, что для Python созданы также модули для работы с естественными языками, а также для лингвистических исследований. Хорошим учебным примером может служить nltk (the Natural Language Toolkit).

Стоит отметить проект PyParsing (сайт:http://pyparsing.sourceforge.net), с помощью которого можно организовать обработку текста по заданной грамматике.

Строки

Строки в языке Python являются типом данных, специально предназначенным для обработки текстовой информации. Строка может содержать произвольно длинный текст (ограниченный имеющейся памятью).

В новых версиях Python имеются два типа строк: обычные строки (последовательность байтов) и Unicode-строки (последовательность символов). В Unicode-строке каждый символ может занимать в памяти 2 или 4 байта, в зависимости от настроек периода компиляции. Четырехбайтовые знаки используются в основном для восточных языков.

Примечание:

В языке и стандартной библиотеке за некоторыми исключениями строки и Unicode-строки взаимозаменяемы, в собственных приложениях для совместимости с обоими видами строк следует избегать проверок на тип. Если это необходимо, можно проверять принадлежность базовому (для строк и Unicode-строк) типу с помощью isinstance(s, basestring).

При использовании Unicode-строк, следует мысленно принять точку зрения, относительно которой именно Unicode-представление является главным, а все остальные кодировки - лишь частные случаи представления текста, которые не могут передать всех символов. Без такой установки будет непонятно, почему преобразование из восьмибитной кодировки называется decode (декодирование). Для внешнего представления можно с успехом использовать кодировку UTF-8, хотя, конечно, это зависит от решаемых задач.

Кодировка Python-программы

Для того чтобы Unicode-литералы в Python-программе воспринимались интерпретатором правильно, необходимо указать кодировку в начале программы, записав в первой или второй строке примерно следующее (для Unix/Linux):

# -*- coding: koi8-r -*-

или (под Windows):

# -*- coding: cp1251 -*-

Могут быть и другие варианты:

# -*- coding: latin-1 -*-
# -*- coding: utf-8 -*-
# -*- coding: mac-cyrillic -*-
# -*- coding: iso8859-5 -*-

Полный перечень кодировок (и их псевдонимов):

>>> import encodings.aliases
>>> print encodings.aliases.aliases
{'iso_ir_6': 'ascii', 'maccyrillic': 'mac_cyrillic', 
'iso_celtic': 'iso8859_14', 'ebcdic_cp_wt': 'cp037', 
'ibm500': 'cp500', ...

Если кодировка не указана, то считается, что используется us-ascii. При этом интерпретатор Python будет выдавать предупреждения при запуске модуля:

sys:1: DeprecationWarning: Non-ASCII character '\xf0' in file example.py 
on line 2, but no encoding declared; 
see http://www.python.org/peps/pep-0263.html for details

Строковые литералы

Строки можно задать в программе с помощью строковых литералов. Литералы записываются с использованием апострофов ', кавычек " или этих же символов, взятых трижды. Внутри литералов обратная косая черта имеет специальное значение. Она служит для ввода специальных символов и для указания символов через коды. Если перед строковым литералом поставлено r, обратная косая черта не имеет специального значения ( r от английского слова raw, строка задается "как есть"). Unicode-литералы задаются с префиксом u. Вот несколько примеров:

s1 = "строка 1"
s2 = r'\1\2'
s3 = """apple\ntree"""  # \n - символ перевода строки
s4 = """apple
tree"""  # строка в утроенных кавычках может иметь внутри переводы строк
s5 = '\x73\65'
u1 = u"Unicode literal"
u2 = u'\u0410\u0434\u0440\u0435\u0441'

Примечание:

Обратная косая черта не должна быть последним символом в литерале, то есть, "str\" вызовет синтаксическую ошибку.

Указание кодировки позволяет применять в Unicode-литералах указанную в начале программы кодировку. Если кодировка не указана, можно пользоваться только кодами символов, заданными через обратную косую черту.

Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Асмик Гаряка
Асмик Гаряка

Почему при вычислении рейтинга не учитывается уровень, как описано? Для всех курсов У=1, хотя для Специалист должно быть 2.

Vera Igonkina
Vera Igonkina
Франция
Игорь Поспелов
Игорь Поспелов
Россия, г. Москва