在 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'
这是
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'