Я пишу программу для нормализации столбцов заголовка 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.
Что я здесь делаю не так?
Да, это все UTF-8. Также обновил мой вопрос.






Я попробовал использовать кодировку «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?
Какая кодировка вашего файла и терминала? Вы открываете файл с правильной кодировкой? Вы пишете результаты с правильной кодировкой?