Регулярные выражения и литералы Юникода - PullRequest
1 голос
/ 23 ноября 2011

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

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'

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

спасибо,

Peter

1 Ответ

2 голосов
/ 23 ноября 2011

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

...