为了匹配Python中Unicode单词边界[如Annex #29定义],我一直在使用
regex
包和标志regex.WORD | regex.V1
(由于模式为Unicode字符串,regex.UNICODE
应该是默认的),用以下方式:>>> s="here are some words"
>>> regex.findall(r'\w(?:\B\S)*', s, flags = regex.V1 | regex.WORD)
['here', 'are', 'some', 'words']
在这些相对简单的情况下它运行良好。然而,我想知道如果输入字符串包含某些标点符号时的预期行为是什么。在我的理解中,WB7 表明,例如 x'z 中的撇号不符合单词边界,这似乎的确是情况:>>> regex.findall(r'\w(?:\B\S)*', "x'z", flags = regex.V1 | regex.WORD)
["x'z"]
然而,如果有元音字母,情况就会改变:
>>> regex.findall(r'\w(?:\B\S)*', "l'avion", flags = regex.V1 | regex.WORD)
["l'", 'avion']
这表明正则表达式模块实现了标准中在Notes部分提到的规则WB5a
。然而,该规则还指出行为应与\u2019
(右单引号)相同,但我无法复现:
>>> regex.findall(r'\w(?:\B\S)*', "l\u2019avion", flags = regex.V1 | regex.WORD)
['l’avion']
此外,即使使用“正常”的撇号,连字(或y
)似乎也表现为“非元音”:>>> regex.findall(r'\w(?:\B\S)*', "l'œil", flags = regex.V1 | regex.WORD)
["l'œil"]
>>> regex.findall(r'\w(?:\B\S)*', "J'y suis", flags = regex.V1 | regex.WORD)
["J'y", 'suis']
这是否是预期的行为?(以上所有示例都是使用regex 2.4.106和Python 3.5.2执行的)