这是模块中的错误,
re并且已在
regex模块中修复:
# -*- coding: utf-8 -*-from __future__ import unipre_literalsimport unipredataimport reimport regex # $ pip install regexword = "किशोरी"def test(re_): assert re_.search("^\w+$", word, flags=re_.UNICODE)print([unipredata.category(cp) for cp in word])print(" ".join(ch for ch in regex.findall("\x", word)))assert all(regex.match("\w$", c) for c in ["a", "u093f", "u0915"])test(regex)test(re) # fails输出结果显示,中有6个代码点
"किशोरी",但只有3个用户可感知的字符(扩展的字素簇)。 在 字符 内
打断一个单词是错误的 。 __ Unipre文本分段说:
词素 ,行边界和句子边界 不应出现在 字素 簇中 :换句话说,就确定这些其他边界的过程而言,字素簇应该是一个原子单位。
在这里,进一步的重点是我的
单词边界在docs中
b定义为从
w到
W(或反向)的过渡:
请注意,形式上, b定义为 w和 W字符之间的边界(反之亦然)或 w与字符串的开头/结尾之间的边界,…
因此,构成单个字符的所有代码点都是
w或全部
W。在这种情况下
"किशोरी"匹配
^w{6}$。从Python
2的文档
w中:
如果设置了UNICODE,它将匹配字符[0-9_]加上 Unipre字符属性数据库中 分类为 字母数字的 任何 字符 。
在Python 3中:
匹配Unipre单词字符;这 包括可以在任何语言中的单词的一部分大多数字符 ,以及数字和下划线。
从
regex文档:
“单词”字符的定义(问题#1693050):
“单词”字符的定义已扩展为Unipre。现在,它符合Unipre规范,网址为
http://www.unipre.org/reports/tr29/。这适用于
w, W, b和 B。
根据unipre.org
U+093F(
DEVANAGARI VOWEL SIGNI),它是字母和数字,因此即使我们遵循并非基于单词边界的定义,
regex也应该考虑它
w。



