странное поведение re.sub в Python 2.7 - PullRequest
0 голосов
/ 23 мая 2018

Я пишу программу для нормализации столбцов 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.

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

1 Ответ

0 голосов
/ 23 мая 2018

Я попытался использовать кодировку "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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...