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字母数字字符定义为字符范围来解决这个问题,但这会很痛苦.或者我做错了什么?
# -*- 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}$
.
如果设置了UNICODE,则这将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的任何字符.
匹配Unicode字符; 这包括大多数可以成为任何语言单词的一部分的字符,以及数字和下划线.
来自regex
docs:
'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
.
归档时间: |
|
查看次数: |
4085 次 |
最近记录: |