Регулярные выражения и литералы Юникода

Я хотел бы удалить некоторые символы из строки (байтовой строки или строки Юникода) с помощью регулярного выражения, например:

pattern = re.compile(ur'\u00AE|\u2122', re.UNICODE)

Если символы указаны как литералы Юникода, результирующее регулярное выражение не работает должным образом с байтовой строкой.

q = 'Canon\xc2\xae  EOS  7D'
pattern.sub('', q)  # 'Canon\xc2  EOS  7D'

Однако, если я преобразую аргумент подстановки в строку в юникоде, он будет работать как положено...

pattern.sub('', unicode(q))  # u'Canon  EOS  7D'

Может кто-нибудь объяснить мне, почему это так?

Спасибо,

Питер

1 ответ

Решение

Потому что стандартная (байтовая) строка не является строкой Юникода. Python не знает, в какой кодировке он находится (или вообще ли это вообще Unicode!), И поэтому не может определить, соответствует ли тот или иной символ Unicode какому-либо символу в нем. Решение состоит в том, чтобы сообщить Python, что это Unicode, используя unicode() функция, как вы уже поняли.

Другие вопросы по тегам