Инструменты
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'