正则表达式锚点 \< 与 \b 用于单词边界

Regex anchor \< versus \b for word boundary

我正在学习正则表达式。其中一个问题要求我找到所有以元音开头的单词。我正在使用 Python 的 re 模块来评估正则表达式。

这是我制作的正则表达式:

\<[aeiouAEIOU].*?\>

以上正则表达式不适用于 \<\> 锚点,但适用于 \b 锚点。为什么?

“不起作用”不正确;一种适用于某些正则表达式方言,另一种适用于其他方言。

大多数“现代”正则表达式方言(Python、Perl、Ruby 等)在两侧都使用 \b 作为单词边界。

更传统的正则表达式方言,像原来的egrep,使用\<作为左边的词边界运算符,\>在右边。

(严格来说,Al Aho 的 原始 egrep 没有单词边界;此功能是后来添加的。也许请参阅 一个-正则表达式历史记录的分钟摘要。)

Python re 不支持“leading/starting 词边界” \< 构造(在其他正则表达式中,还有 \m[[:<:]]),也不是“closing/trailing 单词边界”,\>(在其他正则表达式中,还有 \M[[:>:]])。

请注意,大多数 NFA(通常称为“现代”正则表达式引擎)不支持前导和尾随单词边界。通常的方法是使用 \b,正如您已经注意到的那样,因为它更方便。

然而,这种便利是有代价的:\b 是一种依赖于上下文的模式。这个问题已经在 SO 上得到了非常广泛的讨论,这里是我的回答,涵盖了 \b 的某些方面,请参阅

因此,如果您打算使用 \<\>,您需要像这样手动实现它们:

  • \< = 单词边界处右侧的字符是单词字符的位置,即 \b(?=\w).
  • \> = 单词边界处左侧的字符是单词字符的位置,即 \b(?<=\w).

PCRE library:

中处理这些单词边界变体的方式

COMPATIBILITY FEATURE FOR WORD BOUNDARIES

In the POSIX.2 compliant library that was included in 4.4BSD Unix, the ugly syntax [[:<:]] and [[:>:]] is used for matching "start of word" and "end of word". PCRE treats these items as follows:

[[:<:]] is converted to \b(?=\w)
[[:>:]] is converted to \b(?<=\w)