在 python 中净化文本字符串

Purifying a text string in python

这是 的延续。我有这个字符串;

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

我想保留俄文字母并删除其余部分。因此,我想获得葡萄牙语字母表中所有可能的字母,以便我可以将其应用于任何行。

我的问题是可以从网站上获取某种语言的所有可能的字母吗?或直接从计算机本身。什么都容易。

谢谢并致以最诚挚的问候

迈克尔

这似乎不是一个 Python 相关的问题,我也想说它与编程无关。

但是 - 一如既往地在 StackExchange 网络上有答案,这次在语言学网站上:https://linguistics.stackexchange.com/questions/28766/character-sets-for-top-100-languages-as-opposed-to-unicode

你可以在这里使用str.translate to remove letters from a string and replace them with nothing - I am using some strings constants (see f.e. 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())

输出

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

您需要向 string.ascii_letters 添加更多非 ascii_letters 才能将它们也删除。我从 Portuguese orthography: Diacritics 手动获取它们,这是一次手动操作。

Python 处理 Unicode 的工具以 unicodedata 模块为特色——它有一些工具可以处理这个问题。 在 "character by character" 基础上进行测试,并尝试检查 "if_esque" 结构中重音拉丁字母的所有可能组合,不仅看起来和感觉都不好:这是一种糟糕的方法。

处理 unicode 的最基本工具之一是获取字符名称本身 - 所有拉丁字母的名称中都有 "LATIN",所有西​​里尔字符的名称中都有 "CYRILLIC" .

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)))                                 
        Быстрая коричневая лиса прыгает через ленивую собаку +=

仅凭这些信息,就有可能实现您的 objective - 尽管字符中的 unicode 元数据多于它们的名称,例如它们的 "category"。如果你需要 优化您的过滤器,unicodedata.category(...) 将 return 一个双字符代码 对于字符类别。所有字母(不考虑字母表)都将包含 "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'