Очистка текстовой строки в python


person Michael Schroter    schedule 13.04.2020    source источник
comment
Возможно, s.encode() (кодировка в UTF-8) может помочь вам с некоторыми идеями. По крайней мере, для этого примера представление в байтах выглядит очень по-разному для каждого слова языка.   -  person boechat107    schedule 13.04.2020
comment
Привет, спасибо за ответ. Спасибо и с наилучшими пожеланиями   -  person Michael Schroter    schedule 13.04.2020


Ответы (3)


Инструменты Python для работы с Unicode включают модуль unicodedata, в котором есть некоторые инструменты для решения этой проблемы. Тестирование вещей на основе «символ за символом» и попытка проверить все возможные комбинации акцентированных латинских букв в структуре «if_esque» не только выглядят и чувствуют себя плохо: это плохой подход.

Одним из самых основных инструментов для работы с юникодом является получение самих имен символов - все латинские буквы имеют в своем имени «ЛАТИН», а все кириллические символы имеют в своем имени «КИРИЛЛИЦУ».

In [1]: import unicodedata                                                                                          

In [2]: unicodedata.name("ã")                                                                                       
Out[2]: 'LATIN SMALL LETTER A WITH TILDE'

In [3]: unicodedata.name("ы")                                                                                       
Out[3]: 'CYRILLIC SMALL LETTER YERU'

Ваша стратегия будет отличаться, если вы хотите сохранить пробелы, цифры и т. д., но в основном, если вы хотите удалить все символы, отличные от кириллицы:

In [7]: s = 'A ligeira raposa marrom ataca o cão preguiçoso Быстрая коричневая лиса прыгает через ленивую собаку +='
   ...:                                                                                                             

In [8]: print(''.join(char for char in s if 'CYRILLIC' in unicodedata.name(char)))                                  
Быстраякоричневаялисапрыгаетчерезленивуюсобаку

И наоборот, если вы хотите сохранить все и убрать все латинские символы:

In [9]: print(''.join(char for char in s if 'LATIN' not in unicodedata.name(char)))                                 
        Быстрая коричневая лиса прыгает через ленивую собаку +=

Только с этой информацией можно достичь своей цели, хотя в символах больше метаданных юникода, чем их имя, например их «категория». Если вам нужно уточнить фильтры, unicodedata.category(...) вернет двухсимвольный код для категории символов. Все буквы (независимо от алфавита) будут иметь «L» в первой позиции этого кода, например:

In [10]: unicodedata.category("a")                                                                                  
Out[10]: 'Ll'

In [11]: unicodedata.category("ã")                                                                                  
Out[11]: 'Ll'

In [12]: unicodedata.category("л")                                                                                  
Out[12]: 'Ll'

In [13]: unicodedata.category("A")                                                                                  
Out[13]: 'Lu'

In [14]: unicodedata.category("2")                                                                                  
Out[14]: 'Nd'

person jsbueno    schedule 14.04.2020

Вы можете использовать str.translate для удаления букв из строки. и ничего не заменяю - я использую некоторые строковые константы (см., например, string .ascii_letters) здесь:

from string import ascii_letters, digits, punctuation

s = 'A ligeira raposa marrom ataca o cão preguiçoso Быстрая коричневая лиса прыгает через ленивую собаку +='

# first + second string are translations, last string will be removed from result

to_be_removed = ascii_letters + digits + punctuation + "+=áâãàçéêíóôõú"
t = str.maketrans("", "", to_be_removed)
k = s.translate(t)

print(k.strip())

Выход

Быстрая коричневая лиса прыгает через ленивую собаку

Вам нужно будет добавить больше не ascii_letters в string.ascii_letters, чтобы удалить их. Я взял их вручную из Португальская орфография: диакритические знаки, что является единовременной ручной работой.

person Patrick Artner    schedule 13.04.2020
comment
Привет, спасибо за ответ. Однако это работает только в том случае, если я хочу удалить латиницу. Спасибо и с наилучшими пожеланиями Майкл - person Michael Schroter; 13.04.2020
comment
@michael В этом случае сохранение русского алфавита равносильно удалению специальных диакритических знаков ascii + португальский? - person Patrick Artner; 13.04.2020
comment
@downvoter - оставление комментария о том, что заставило вас понизить голос, позволяет мне это исправить. - person Patrick Artner; 14.04.2020
comment
Downvoter здесь: подход совершенно не оптимален, поскольку существует более 100 000 символов Юникода - явное занесение в черный список того, что вы хотите удалить, вряд ли будет действительно функциональным. Есть метаданные о самих персонажах, которые можно использовать для фильтрации в подобных случаях. - person jsbueno; 03.06.2020
comment
@jsbueno ваш ответ превосходен - и единственный голос за него принадлежит мне. Мой ответ выполним для сохранения русского и удаления португальского пожал плечами - это то, что было нужно. Я узнал от вас, что вы также можете запросить метаинформацию. Спасибо за ответ. - person Patrick Artner; 03.06.2020
comment
Обычно я не минусую вещи, которые хотя бы работают, и я обычно не минусую без комментариев — скорее всего, у меня был плохой день. Однако система не позволит мне удалить отрицательный голос, если вопрос не отредактирован - я внесу редактирование без операции, чтобы я мог его изменить. - person jsbueno; 04.06.2020

Кажется, это не вопрос, связанный с Python, и я бы также сказал, что он не связан с программированием.

Однако, как всегда, в сети StackExchange есть ответ, на этот раз на сайте лингвистики: https://linguistics.stackexchange.com/questions/28766/character-sets-for-top-100-languages.-как-против-юникода

person Vaiden    schedule 13.04.2020
comment
если ОП использует Python для своего кода, это, очевидно, связано с Python, поскольку у них будет постоянный доступ к инструментам Python для работы с юникодом, таким как модуль Python stdlib unicodedata (у которых есть инструменты для решения этой головоломки) - person jsbueno; 14.04.2020