如何使用正则表达式匹配带有边界的单词?

Dja*_*oPy 2 python regex

例如,我有这个字符串: "http://www.google.com/this_is_our_network/"

我想匹配“工作”这个词,但在开头或结尾都没有字母字符。在上面的示例中,正则表达式不应返回匹配项。

但是,在这个字符串中:"http://www.google.com/work_for_us.html"正则表达式应该匹配,因为开头和结尾都没有字母字符。

spe*_*akr 6

试试这个正则表达式: (?<=[\W_])work(?=[\W_])

这使用积极的前瞻和后视断言来尊重封闭字符,但不将它们包含在匹配中。

这个正则表达式匹配 work

  1. 如果它跟随一个\W字符或下划线
    AND
  2. 如果后跟一个\W字符或下划线。

\b不能使用单词边界匹配,因为这里不需要_匹配\w


进一步的例子:

  • 匹配多个单词:
    (?<=[\W_])(work|job)(?=[\W_])

  • 与上面相同但不创建子匹配:
    (?<=[\W_])(?:work|job)(?=[\W_])

  • 也尊重线端:
    (?<=[\W_])(?:work|job)(?=[\W_]|$)


关于正则表达式语法的一些有用说明:

  • \w匹配所有字母数字字符和下划线;这相当于[a-zA-Z0-9_]

  • \W 正好相反 \w

  • \b匹配 a\w和一个\W字符之间的边界(或反之亦然)

  • 正前瞻断言:
    foo(?=bar)匹配foo后跟bar,不包含bar在匹配中。

  • 正后视断言:
    (?<=foo)bar匹配,bar如果它跟在foo,不包括foo在匹配中。

有关 (python) regex 语法的更多信息,请考虑python regex docsperl regex docs。此外,基于 Web 的Python Regex 工具可方便地进行测试。