Каков наилучший способ удалить акценты в строке Unicode Python?

Я хотел бы добавить, что если вы получите расширение MoreLinq, теперь есть поддержка как гомогенных, так и гетерогенных левых соединений теперь

http://morelinq.github.io/2.8/ref /api/html/Overload_MoreLinq_MoreEnumerable_LeftJoin.htm

пример:

//Pretend a ClientCompany object and an Employee object both have a ClientCompanyID key on them

return DataContext.ClientCompany
    .LeftJoin(DataContext.Employees,                         //Table being joined
        company => company.ClientCompanyID,                  //First key
        employee => employee.ClientCompanyID,                //Second Key
        company => new {company, employee = (Employee)null}, //Result selector when there isn't a match
        (company, employee) => new { company, employee });   //Result selector when there is a match

EDIT:

В ретроспективе это может сработать, но оно преобразует IQueryable для IEnumerable, поскольку morelinq не преобразует запрос в SQL.

Вместо этого вы можете использовать GroupJoin, как описано здесь: https://stackoverflow.com/a/24273804/4251433

Это гарантирует, что он останется как IQueryable, если вам понадобится дальнейшие логические операции над ним позже.

444
задан Mark Amery 16 February 2015 в 22:01
поделиться

3 ответа

Unidecode - правильный ответ. Он транслитерирует любую строку Unicode в максимально возможное представление в тексте ascii.

Пример:

accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'
398
ответ дан 22 November 2019 в 22:57
поделиться

Как насчет этого:

import unicodedata
def strip_accents(s):
   return ''.join(c for c in unicodedata.normalize('NFD', s)
                  if unicodedata.category(c) != 'Mn')

Это работает над греческими буквами, также:

>>> strip_accents(u"A \u00c0 \u0394 \u038E")
u'A A \u0394 \u03a5'
>>> 

символьная категория "Mn" обозначает Nonspacing_Mark, который подобен unicodedata.combining в ответе MiniQuark (я не думал о unicodedata.combining, но это - вероятно, лучшее решение, потому что это более явно).

И имеют в виду, эти манипуляции могут значительно изменить значение текста. Диакритические знаки, Умляуты и т.д. не являются "художественным оформлением".

258
ответ дан BartoszKP 17 February 2015 в 08:01
поделиться

Я просто нашел этот ответ в сети:

import unicodedata

def remove_accents(input_str):
    nfkd_form = unicodedata.normalize('NFKD', input_str)
    only_ascii = nfkd_form.encode('ASCII', 'ignore')
    return only_ascii

Это хорошо работает (для французского языка, например), но я думаю, что второй шаг (удаляющий диакритические знаки) мог быть обработан лучше, чем отбрасывание символов неASCII, потому что это перестанет работать для некоторых языков (греческий язык, например). Лучшее решение состояло бы в том, чтобы, вероятно, явно удалить unicode символы, которые отмечены как являющийся диакритическими знаками.

Редактирование : это добивается цели:

import unicodedata

def remove_accents(input_str):
    nfkd_form = unicodedata.normalize('NFKD', input_str)
    return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])

unicodedata.combining(c) возвратит true, если символ c может быть объединен с предшествующим символом, который является главным образом, если это - диакритический знак.

Редактирование 2 : remove_accents ожидает строка unicode, не строка байтов. Если у Вас есть строка байтов, то необходимо декодировать ее в строку unicode как это:

encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café"  # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)
135
ответ дан Community 17 February 2015 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: