# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import unicodedata
import re
import regex # $ pip install regex
word = "??????"
def test(re_):
assert re_.search("^\\w+$", word, flags=re_.UNICODE)
print([unicodedata.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个用户可感知的字符(扩展的字素簇)。 Unicode文本分段说:
词素 ,行边界和句子边界 不应出现在 字素 簇中 :换句话说,就确定这些其他边界的过程而言,字素簇应该是一个原子单位。
在这里,进一步的重点是我的
单词边界在docs中\b
定义为从\w
到\W
(或反向)的过渡:
请注意,形式上,\ b定义为\ w和\ W字符之间的边界(反之亦然)或\ w与字符串的开头/结尾之间的边界,…
因此,构成单个字符的所有代码点都是\w
或全部\W
。在这种情况下"??????"
匹配^\w{6}$
。
如果设置了UNICODE,它将匹配字符[0-9_]加上 Unicode字符属性数据库中 分类为 字母数字的 任何 字符 。
匹配Unicode单词字符;这 包括可以在任何语言中的单词的一部分大多数字符 ,以及数字和下划线。
从regex
文档:
“单词”字符的定义(问题#1693050):
“单词”字符的定义已扩展为Unicode。现在,它符合Unicode规范,网址为http://www.unicode.org/reports/tr29/。这适用于\ w,\ W,\ b和\ B。
根据unicode.org U+093F
(DEVANAGARI VOWEL SIGN I
),它是字母和数字,因此即使我们遵循并非基于单词边界的定义,regex
也应该考虑它\w
。