Регулярные выражения и литералы Юникода
Я хотел бы удалить некоторые символы из строки (байтовой строки или строки Юникода) с помощью регулярного выражения, например:
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()
функция, как вы уже поняли.