<p>Python处理Unicode的工具以Unicode数据模块为特色,该模块有一些工具来处理这个问题。
在“一个字符一个字符”的基础上进行测试,并尝试在“如果”式结构中检查所有可能的重音拉丁字母组合,不仅外观和感觉都不好:这是一种糟糕的方法</p>
<p>处理unicode最基本的工具之一是获取字符名称本身——所有拉丁字母的名称中都有“拉丁”,所有西里尔字母的名称中都有“西里尔字母”</p>
<pre><code>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'
</code></pre>
<p>如果您想保留空格、数字等,您的策略会有所不同,但基本上,如果您想删除所有非西里尔字母字符:</p>
<pre><code>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)))
Быстраякоричневаялисапрыгаетчерезленивуюсобаку
</code></pre>
<p>相反,如果要保留所有内容并删除所有拉丁字符:</p>
<pre><code>In [9]: print(''.join(char for char in s if 'LATIN' not in unicodedata.name(char)))
Быстрая коричневая лиса прыгает через ленивую собаку +=
</code></pre>
<p>仅凭这些信息,就有可能实现您的目标——尽管字符中的unicode元数据比它们的名称更多,比如它们的“类别”。如果你需要
优化过滤器,<code>unicodedata.category(...)</code>将返回两个字符的代码
对于角色类别。所有字母(不考虑字母表)中都有“L”
该代码的第一个位置,例如:</p>
<pre><code>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'
</code></pre>