суббота, 23 июля 2011 г.

Python: применение регулярных выражений для кириллицы

Одним из мощных инструментов в языке Python являются регулярные выражения. Чтобы их использовать необходимо подключить библиотеку re:
> import re
Подробнее о регэкспах (от англ. сокращения regexp) в Python можно почитать, например, здесь (англ.) или здесь (рус.)

Существенной проблемой, однако, является то, что в простейшем варианте регэкспы работают только для латиницы. Использование их с кириллицей требует определённых дополнительных усилий.

Собственно, дело в том, что все строки в Питоне хранятся в формате str, который всегда имеет определённую кодировку (utf8, cp1251, koi8r и т. д.), а сам Питон работает с текстом в формате unicode (подробности можно найти в замечательном обзоре от Олега Нечаева). Для латиницы это обычно проблем не вызывает, а вот для кириллицы разница существенная.

Рецепт борьбы прост. Надо проводить все действия в формате unicode. Для того, чтобы задать строку в юникоде, необходимо перед ней добавить букву u:
> text = u'Текст'
Если у вас уже есть некий текст в известной кодировке (например, вы прочли его из файла или скачали из интернета), то его следует перекодировать в юникод с помощью команд unicode или decode:
> unicode_text = unicode(utf8_text, 'utf8')
> unicode_text = utf8_text.decode('utf8')
Далее необходимо при использовании регулярных выражений не забывать и их переводить в юникод:
> regexp = re.compile(u'[а-я]')
Проверьте, теперь команда
> re.sub(regexp, '', 'КрасОТИЩЕ')
должна выдавать
> КОТИЩЕ