Python unicode正则表达式匹配失败了一些unicode字符-bug或错误?

Sha*_*arG 9 python regex unicode

我试图re在Python 2.7.3中使用Unicode编码的Devnagari文本.我已经添加from __future__ import unicode_literals到我的代码的顶部,所以所有字符串文字都应该是unicode对象.

但是,我遇到了Python正则表达式匹配的一些奇怪问题.例如,考虑这个名字:"किशोरी".这是一个(拼写错误的)名字,用印地语,由我的一个用户输入.任何印地语读者都会认为这是一个词.

以下内容返回匹配,因为它应该:

re.search("^[\w\s][\w\s]*","??????",re.UNICODE)

但这不是:

re.search("^[\w\s][\w\s]*$","??????",re.UNICODE)

一些探险者透露,该字符串中只有一个字符,字符0915(क)被识别为属于\ w字符类.这是不正确的,因为"派生核心属性"上的Unicode字符数据库文件将此字符串中的其他字符(我没有全部检查过)列为字母 - 实际上它们就是这样.

这只是Python实现中的一个错误吗?我可以通过手动将所有Devnagari字母数字字符定义为字符范围来解决这个问题,但这会很痛苦.或者我做错了什么?

jfs*_*jfs 7

这是模块中的一个错误,re它在regex模块中修复:

# -*- 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
Run Code Online (Sandbox Code Playgroud)

输出显示有6个代码点"??????",但只有3个用户感知的字符(扩展的字形集群).打破角色里面的单词是错误的. Unicode文本分段说:

字形边界,线边界和句子边界不应出现在字形集群中:换句话说,字形集群应该是与确定这些其他边界的过程相关的原子单元.

在这里,进一步强调我的

词边界\b被定义为从过渡\w\W(或反向)在该文档:

请注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者在\ w和字符串的开头/结尾之间,...

因此,形成单个字符的所有代码点都是\w或者它们都是\W.在这种情况下"??????"匹配^\w{6}$.


Python 2中的文档\w:

如果设置了UNICODE,则这将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的任何字符.

Python 3中:

匹配Unicode字符; 这包括大多数可以成为任何语言单词的一部分的字符,以及数字和下划线.

来自regexdocs:

'word'字符的定义(问题#1693050):

已经为Unicode扩展了"单词"字符的定义.它现在符合http://www.unicode.org/reports/tr29/上的Unicode规范 .这适用于\ w,\ W,\ b和\ B.

根据unicode.org U+093F(DEVANAGARI VOWEL SIGN I)是alnum和alphabetic,因此即使我们遵循不基于单词边界的定义regex也是正确的\w.