Странное поведение 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, это, очевидно, будет неудачно с вашим примером.

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

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

  • Python: хранить много регулярных совпадений в кортеже?
  • Соответствовать многострочному регулярному выражению в файловом объекте
  • IPv6 regexp python
  • Проблема с регулярными выражениями в python
  • Исходные строки Python и unicode: как использовать веб-вход в качестве шаблонов регулярных выражений?
  • «\ D» в регулярном выражении означает цифру?
  • Получить групповое совпадение в re.sub в Python
  • Отрицательный взгляд на python regex
  •  
    Interesting Posts for Van-Lav

    Как изящно прервать загрузку urllib2?

    Динамически добавлять легенды к графикам matplotlib в python

    Очистить с помощью красивого супа, сохраняющего & nbsp; юридические лица

    Можно ли отлаживать отладчик python при использовании py.test?

    Python – векторы скорости и ускорения в определенных точках

    Ошибка при копировании составного объекта, состоящего в основном из pandas.DataFrame

    Применение пользовательской функции при группировке возвращает NaN

    Эффективный способ определить, находится ли конкретная функция в стеке в Python

    Выполнять функцию в парах строк в кадре данных Pandas

    Какие реализации DHT совместимы с Python 3.x?

    Общая папка / структура файла в приложении Flask

    Прочтите zip и напишите его другому файлу python

    PySpark – Объединение данных сеанса без явного ключа сеанса / Итерирование по всем строкам

    RegExp: Получить текст в круглых скобках

    ImportError: нет модуля с именем 'resource'

    Python - лучший язык программирования в мире.