Python 2.7 странное поведение re.sub в Юникоде

Я пишу программу для нормализации столбцов заголовка csv. Может случиться так, что столбец содержит неанглийский символ, поэтому я добавил флаг re.UNICODE к своим вызовам re.sub.

Мой код выглядит так:

 for i in range(0, len(row)):
    column = row[i]
    column = column.lower()
    column = re.sub('[\W]', '_', column, flags=re.IGNORECASE | re.UNICODE)
    column = re.sub('[_]{2,}', '_', column, flags=re.UNICODE)
    column = column.strip('_')
    print column

В моем текущем сценарии у меня есть один столбец с неанглийским символом: Printer geïntegreerd. Кодировка исходного файла - UTF-8. Я пока не записываю результат в файл, а просто пишу в консоль.

Столбец преобразуется в: printer_ge�_ntegreerd.

Когда я оставляю флаг re.UNICODE, он преобразуется в printer_ge_ntegreerd.

Что я здесь делаю не так?

Какая кодировка вашего файла и терминала? Вы открываете файл с правильной кодировкой? Вы пишете результаты с правильной кодировкой?

viraptor 23.05.2018 10:39

Да, это все UTF-8. Также обновил мой вопрос.

Timon de Groot 23.05.2018 10:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попробовал использовать кодировку «utf-8» и получил желаемый результат:

for i in range(0, len(row)):
    column = row[i].decode('utf-8')
    column = column.lower()
    column = re.sub('[\W]', '_', column, flags=re.IGNORECASE | re.UNICODE)
    column = re.sub('[_]{2,}', '_', column, flags=re.UNICODE)
    column = column.strip('_')
    print column

Когда вы читаете ввод из файла, он имеет тип str с определенной кодировкой, когда вы пытаетесь манипулировать им с помощью «re», он использует декодирование по умолчанию «ascii». Это неправильная кодировка в вашем случае, наиболее распространенная кодировка - «utf-8» и «latin-1», которые преобразуют переменную в тип unicode. «re» правильно распознает символы в переменных типа unicode. Обратите внимание, что столбец после декодирования имеет тип unicode.

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

Это работает! Не могли бы вы объяснить, зачем нужно делать decode?

Timon de Groot 23.05.2018 10:47

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