在python中净化文本字符串

2024-09-30 04:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

这是this question的延续。我有这根绳子

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

我想保留俄文字母,去掉其余的。因此,我想得到葡萄牙语字母表中所有可能的字母,以便我可以将其应用于任何行

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

多谢各位;致意

迈克尔


Tags: 语言网站字母this字母表question绳子oso
3条回答

您可以使用str.translate从字符串中删除字母,并将其替换为零-我在这里使用了一些字符串常量(请参见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_添加更多的非ascii_letters字母来删除它们。我从Portuguese orthography: Diacritics手动获取它们,这是一次手动操作

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

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

Python处理Unicode的工具以Unicode数据模块为特色,该模块有一些工具来处理这个问题。 在“一个字符一个字符”的基础上进行测试,并尝试在“如果”式结构中检查所有可能的重音拉丁字母组合,不仅外观和感觉都不好:这是一种糟糕的方法

处理unicode最基本的工具之一是获取字符名称本身——所有拉丁字母的名称中都有“拉丁”,所有西里尔字母的名称中都有“西里尔字母”

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

仅凭这些信息,就有可能实现您的目标——尽管字符中的unicode元数据比它们的名称更多,比如它们的“类别”。如果你需要 优化过滤器,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'

相关问题 更多 >

    热门问题