2

我正在使用PyPI 模块regex进行正则表达式匹配。它说

  • 默认 Unicode 字边界

    WORD标志将“字边界”的定义更改为默认 Unicode 字边界的定义。这适用于\b\B

但似乎什么都没有改变:

>>> r1 = regex.compile(r".\b.", flags=regex.UNICODE)
>>> r2 = regex.compile(r".\b.", flags=regex.UNICODE | regex.WORD)
>>> r1.findall("русский  ελλανικα")
['й ', ' ε']
>>> r2.findall("русский  ελλανικα")
['й ', ' ε']

我没发现有什么不同……?

4

1 回答 1

2

带或不带标志的区别在于WORD定义字边界的方式。

给定这个例子:

import regex

t = 'A number: 3.4 :)'

print(regex.search(r'\b3\b', t))
print(regex.search(r'\b3\b', t, flags=regex.WORD))

第一个将打印匹配,而第二个返回None,为什么?因为“Unicode 单词边界”包含了一组区分单词边界的规则,而默认的 python 单词边界将其定义为任何非\w字符(仍然是 Unicode 字母数字)。

在示例中,3.4由于存在字符,因此被 python 的默认单词边界分割\W,句点,因此它是单词边界。对于 Unicode 字边界,一条规则将“禁止在“.”上打断,例如“3.4”,因此句点不被视为字边界。

在此处查看所有 Unicode 字边界规则:https ://unicode.org/reports/tr29/#Sentence_Boundary_Rules

结论:

它们都适用于 Unicode 或 your LOCALE,但WORDflag 提供了一组额外的规则来区分单词边界,而不仅仅是 a 的空字符串\W,因为“一个单词被定义为单词字符 [ \w] 的序列”。

于 2018-09-20T01:58:34.537 回答