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

时间:2018-09-20 00:58:09

标签: python regex unicode word-boundary python-regex

我正在使用PyPI module 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("русский  ελλανικα")
['й ', ' ε']

我没有发现任何不同...?

1 个答案:

答案 0 :(得分: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或您的LOCALE一起使用,但是WORD标志提供了一组额外的规则来区分单词边界,除了\W的空字符串之外,因为“被定义为单词字符[\w]的序列。