我正在使用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("русский ελλανικα")
['й ', ' ε']
我没有发现任何不同...?
答案 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
]的序列。