Странное поведение re.sub с utf-8-строками

Может ли кто-нибудь объяснить мне это странное поведение? Я ожидал бы, что оба метода замены будут работать или не будут работать одновременно. Это только я или есть кто-нибудь, кто не считает это последовательным?

>>> u'è'.replace("\xe0","") Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) >>> re.sub(u'è','\xe0','',flags=re.UNICODE) '' 

(Обратите внимание, что я не прошу объяснить, почему u'è'.replace ("\ xe0", "") вызывает ошибку!)

2 Solutions collect form web for “Странное поведение re.sub с utf-8-строками”

Из Unicode Doc

аргументами этих методов могут быть строки Unicode или 8-битные строки. 8-битные строки будут преобразованы в Unicode перед выполнением операции; Используется кодировка ASCII по умолчанию Python, поэтому символы, превышающие 127, вызовут исключение

От Re Doc :

Этот модуль обеспечивает операции согласования регулярных выражений, аналогичные тем, которые были найдены в Perl. Оба шаблона и строки для поиска могут быть строками Unicode, а также 8-битными строками.

Поскольку для модуля Re вы явно не указываете флаг Unicode, он не пытается преобразовать и, следовательно, не поднимает ошибку. Вот почему они не ведут себя когерентно

Python 2.X имеет несколько неестественную обработку кодировки, которая принимает неявное преобразование. Он попытается воспроизвести строки unicode и no-unicode, когда пользователь не выполнит конверсию. В конце концов, это не решает проблему: кодирование должно быть подтверждено разработчиком с самого начала. Python 2 просто делает вещи менее явными и немного менее очевидными.

 >>> u'è'.replace(u"\xe0", u"") u'\xe8' 

Это ваш оригинальный пример, за исключением того, что я специально сказал Python, что все строки были unicode. Если вы этого не сделаете, Python попытается их преобразовать. И поскольку кодировка по умолчанию в Python 2 является ASCII, это, очевидно, будет неудачно с вашим примером.

Кодирование – сложный вопрос, но с некоторыми хорошими привычками (например, раннее преобразование, всегда будучи уверенным в том, какой тип данных обрабатывается программой в заданной точке), обычно (и я настаиваю, УБИЙСТВО) хорошо.

Надеюсь, это поможет!

  • Могу ли я использовать именованные группы в регулярном выражении Perl для получения результатов в хеше?
  • Ruby Regex vs Python Regex
  • Как я могу получить часть регулярного выражения как переменную в python?
  • python разделен на несколько ошибок разделителей?
  • Разделение списка имен, где может быть общее имя для двух первых имен
  • Регулярное выражение: как совместить строку, содержащую «\ n» (новая строка)?
  • Как работают правила Scrapy с помощью паука сканирования
  • Регулярное выражение Python для Beautiful Soup
  • Python - лучший язык программирования в мире.