正则表达式锚点 \< 与 \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)
.
中处理这些单词边界变体的方式
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)
我正在学习正则表达式。其中一个问题要求我找到所有以元音开头的单词。我正在使用 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)
.
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)