isalpha对一些僧伽罗语单词给出True



我想检查一个句子是否只有僧伽罗语单词(只要是用僧伽罗语写的,它们就可以是无意义的单词)。有时在一个句子中会有英语单词和僧伽罗语单词混在一起。问题是有时僧伽罗语的Trueisalpha()在我的分类中会给出不正确的结果。

例如,我做了这样的事情。

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

相关内容

  • 没有找到相关文章

最新更新