Python regex.WORD如何影响\b的行为?

Python regex.WORD如何影响\b的行为?,python,regex,unicode,word-boundary,python-regex,Python,Regex,Unicode,Word Boundary,Python 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.finda

我正在使用正则表达式进行匹配。上面说

  • 默认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("русский  ελλανικα")
['й ', ' ε']

我没有观察到任何差异…?

带或不带
单词
标志的区别在于单词边界的定义方式

举个例子:

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单词边界规则:

结论:


它们都可以使用Unicode或您的
语言环境
,但是
WORD
标志除了提供
\W
的空字符串外,还提供了一组额外的规则来区分单词边界,因为“单词定义为单词字符序列[
\W
]”.

您可以判断的方法是使用非Unicode正则表达式模拟
(?:(?:^|(?@sln no………..Python regex将Unicode与
\w
正确匹配,正如文档所说,该标志只影响
\b
。我建议您退出此参数。我猜WORD不会正确影响边界,除非您能证明它。不管它的价值如何,您可以在此处看到相同的行为并注意默认的统计信息e除了全局外没有其他标志。我估计它使用的是re模块,但有一个Unicode标志不起任何作用,因此它可能是regex模块中的一个保留标志,以避免干扰任何东西。@sln regex101不适合这样做。我特别说过我使用的是第三方模块,而不是Python的stock
re
。这有区别。你确定那里定义了单词边界吗?我的意思是它看起来像很多
单词break
属性,不要与
\b
语法混淆。因此它是单词break属性。我可以告诉你,在
\b
构造中实现它是相当不可能的。在
\b
的非Unicode实现中,完成了在C语言中,它实际上是一个没有太多开销的字符串原语。在Unicode实现中,一旦定义了单词(它不仅仅是alnum属性,它是下划线表示的所有细节),这要复杂得多。是的,我明白了。我可以告诉你,正则表达式的实现者根本不会试图通过句子来实现这种复杂性。我可以看到那个做正则表达式的家伙在尝试它。你有没有看到他用在正则表达式中的一些bizarr语法,omg…是的,这可能就是为什么它不是标准正则表达式库中的一个选项python