2012-01-01 2 views
9

Можно создать дубликат:
What is the best way to remove accents in a python unicode string?
Python and character normalizationудаления акцент и специальные символы

Я хотел бы удалить акценты, превратить все символы в нижнем регистре, а также удалять любые цифры и специальные символы.

Пример:

Frédér8ic @ -> Frederic

Предложение:

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if \ 
    unicodedata.category(x)[0] == 'L').lower() 

Есть ли лучший способ сделать это?

+0

Не могли бы вы отредактировать свой ответ, чтобы включить некоторые примеры желаемого ввода и вывода? –

+0

@Christian Jonassen Frédér8ic @ -> frederic @@ àbcd -> abcd% * tréçd -> trecd – Fred

+0

Я использую python 3.x – Fred

ответ

14

Возможное решение будет

def remove_accents(data): 
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.ascii_letters).lower() 

Использование NFKD AFAIK это стандартный способ нормализации Юникода, чтобы преобразовать его в совместимых символов. Остальное, чтобы удалить номера специальных символов и символы юникода, которые возникли из нормализации, вы можете просто сравнить с string.ascii_letters и удалить любой символ в этом наборе.

+0

очень хорошо, спасибо! – Fred

+2

Но какова строковая переменная в этой команде? Где вы указываете 'if x in string.ascii_letters' – Falcoa

+0

@Falcoa является жестким. Есть еще одно решение: def remove_accents (self, data): return unicodedata.normalize ('NFKD', data) .encode ('ASCII', 'ignore') – lesimoes

1

Можете ли вы преобразовать строку в объекты HTML? Если это так, вы можете использовать простое регулярное выражение.

Следующая замена будет работать в PHP/PCRE (см my other answer для примера):

'~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i' => '$1' 

Затем просто преобразовать обратно из HTML-сущностей и удаления любых не a-Z полукокса (demo @ CodePad).

Извините, я не знаю Python, чтобы дать ответ Pythonic.

+1

Я не уверен, что регулярное выражение более эффективно, чем UnicodeData – Fred

+0

@ user1125315: Я тоже не уверен, но он правильно передает ваши тесты ввода/вывода. Не стесняйтесь попробовать другие подходы, хотя 'unidecode' lib кажется потрясающим. –

Смежные вопросы