【发布时间】:2017-01-01 03:29:57
【问题描述】:
为了匹配 Python 中的 Unicode 字边界 [如 Annex #29 中定义的那样],我一直在使用带有标志 regex.WORD | regex.V1 的 regex 包(regex.UNICODE 应该是默认值,因为该模式是 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']
这表明正则表达式模块实现了注释部分标准中提到的规则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 执行)
【问题讨论】:
标签: python regex python-3.x unicode