Python и нормализация символов

Здравствуйте, я получаю текстовые данные utf8 из иностранного источника, который содержит специальные символы, такие как u"ıöüç", в то время как я хочу нормализовать их на английский язык, например "ıöüç" -> "iouc" . Каков наилучший способ добиться этого?


person Hellnar    schedule 12.11.2010    source источник
comment
Поиск и замена, возможно, вам понадобится полный набор специальных и обычных символов.   -  person soulseekah    schedule 12.11.2010


Ответы (4)


Я рекомендую использовать модуль Unicode:

>>> from unidecode import unidecode
>>> unidecode(u'ıöüç')
'iouc'

Обратите внимание, как вы передаете ему строку юникода, и он выводит строку байтов. Вывод гарантированно будет ASCII.

person Constantin    schedule 12.11.2010

Все зависит от того, насколько далеко вы хотите зайти в транслитерации результата. Если вы хотите полностью преобразовать все в ASCII (от αβγ до abg), то unidecode — это то, что вам нужно.

Если вы просто хотите удалить акценты из букв с акцентом, вы можете попробовать разложить свою строку, используя форму нормализации NFKD (это преобразует букву с акцентом á в простую букву a, за которой следует U+0301 COMBINING ACUTE ACCENT), а затем отбросить акценты (которые принадлежат Класс символов Unicode Mn — "Отметить, без пробелов").

import unicodedata

def remove_nonspacing_marks(s):
    "Decompose the unicode string s and remove non-spacing marks."
    return ''.join(c for c in unicodedata.normalize('NFKD', s)
                   if unicodedata.category(c) != 'Mn')
person Gareth Rees    schedule 12.11.2010

Самый простой способ, который я нашел:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")

person Sylvain    schedule 12.04.2017

import unicodedata
unicodedata.normalize()

http://docs.python.org/library/unicodedata.html

person soulseekah    schedule 12.11.2010
comment
Я немного сбит с толку: я попытался напечатать unicodedata.normalize('NFKD', uıöüç), и результат снова: ıöüç - person Hellnar; 12.11.2010
comment
Попробуйте другие допустимые значения «NFC», «NFKC», «NFD» и «NFKD». - person soulseekah; 12.11.2010
comment
Я совершенно уверен, что это другая операция, чем то, что ищет спрашивающий. Но да, это нормализация юникода. То, о чем он спрашивает, обычно не упоминается как таковое. - person drxzcl; 12.11.2010
comment
Правильно. Кажется, это называется transliteration. - person soulseekah; 12.11.2010