我想检查一个句子是否只有僧伽罗语单词(只要是用僧伽罗语写的,它们就可以是无意义的单词)。有时在一个句子中会有英语单词和僧伽罗语单词混在一起。问题是有时僧伽罗语的True
和isalpha()
在我的分类中会给出不正确的结果。
例如,我做了这样的事情。
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
print(i.isalpha())
为
True
False
False
True
有没有办法克服这个
isalpha
的工作原理是通过检查Unicode字符的类别是否为Lm, Lt, Lu, Ll, or Lo.
,参见下面的含义。
Ll Lowercase Letter
Lm Modifier Letter
Lo Other Letter
Lu Uppercase Letter
这"breaks"当字符连接在一起时。在你的第一个例子中,如果我们看到ම
或ට
,类别(从下面的查找工具)是Lo
。这是有效的,所以我们得到True
在第二个示例中,第一个字母是කෑ
,实际上是两个字符(ක
和ෑ
)。ෑ
的类别不是一个字母,所以它返回False。
长话短说,Python在技术上是正确的。如果你要做你想做的事情,你必须分割连接字符,然后删除添加的额外字符。
所以,这很复杂。可能有这样的图书馆,但我不知道。
欢呼- 来源:https://docs.python.org/3/library/stdtypes.html str.isalnum
- 字符查找:https://www.compart.com/en/unicode/
这是一个老问题,但是对这个问题的分析有些不完整。简单地说:并不是所有的构词字符都是字母字符。文字匹配是不够的。python对字母的定义是那些被分配为" Lm ", " Lt ", " Lu ", " Ll "one_answers" Lo "类别的Unicode字符。
这排除了许多组成单词的字符,包括组合变音符,南亚和东南亚语言中的依赖元音,加泰罗尼亚语中的标点符号volant等。
此外,Python对字母字符的定义并不总是与Unicode的定义一致。对于Unicode,我们使用"Lm","Lt","Lu","Ll","Lo","Nl"one_answers"Other_Alphabetic"。
问题给出了Python解释的结果:
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
print(i.isalpha())
结果:
True
False
False
True
Unicode定义:
import regex
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
print(bool(regex.match(r'^p{Alphabetic}+$', i)))
结果:
True
True
False
True
稍微好一点,但还不够。一种可能的补充是扩展regex模式:
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
if len(i) == 1:
result = bool(regex.match(r'[p{Alphabetic}]', i))
else:
result = bool(regex.match(r'^p{Alphabetic}[p{Alphabetic}p{Mn}p{Mc}u00B7]*$', i))
print(result)
给了:
True
True
True
True
或者使用元字符作为构词法字符:
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
print(bool(regex.match(r'[w]+', i)))
给了:
True
True
True
True
这可能有帮助
from string import ascii_lowercase, ascii_uppercase
all = ascii_uppercase + ascii_lowercase
for i in ['මට', 'කෑම', 'කන්න', 'ඕන']:
print(i in all)
下面是输出
False
False
False
False