Очистка текстовой строки в python - PullRequest
2 голосов
/ 13 апреля 2020

Это продолжение , этот вопрос . У меня есть эта строка;

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

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

Мой вопрос: возможно ли получить все возможные буквы определенного языка с сайта? или непосредственно с самого компьютера. Что бы ни было проще.

Спасибо и наилучшими пожеланиями

Майкл

Ответы [ 3 ]

1 голос
/ 14 апреля 2020
Инструменты

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

Один из большинство базовых c инструментов для работы с юникодом - это получение имен самих символов - все латинские буквы имеют в своем имени «LATIN», а все символы кириллицы c имеют «CYRILLI C» в своем имени.

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'

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

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'

0 голосов
/ 13 апреля 2020

Вы можете использовать str.translate , чтобы удалить буквы из строки и заменить их ничем - я использую некоторые строковые константы (см. Fe 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, чтобы удалить их. Я взял их вручную из португальской орфографии: Diacritics , которая является ручным одноразовым усилием.

0 голосов
/ 13 апреля 2020

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

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

...