【问题标题】:Python regex not matching at word boundary as requiredPython 正则表达式在字边界处未按要求匹配
【发布时间】:2015-04-10 13:38:29
【问题描述】:

我想在“单词边界”匹配一组模式,但模式可能有一个前缀 [#@],如果存在应该匹配。

我在 python 中使用以下正则表达式模式。

r"\b[@#]?(abc|ef|ghij)\b"

示例文本为:#abc is a pattern which should match. also abc should match. And finally @ef

在本文中,只有 abc、abc 和 ef 匹配,而没有我想要的 #abc 和 @ef。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    您需要将单词边界放在您作为可选的[@#] 旁边。因为在这个#abc 部分有一个非单词边界\B 存在于# 之前(不是单词字符)和行首之后(不是单词字符) 不是单词边界\b。请注意,\b 匹配单词字符和非单词字符,反之亦然。 \B 匹配两个单词字符或两个非单词字符。

    r"[@#]?\b(abc|ef|ghij)\b"
    

    如果将\b 放在[@#] 之前,它将匹配foo@abcbar#abc 之类的字符串,因为这里实际上在@# 之前存在单词边界。

    DEMO

    示例:

    >>> s = "#abc is a pattern which should match. also abc should match. And finally @ef"
    >>> re.findall(r'[@#]?\b(?:abc|ef|ghij)\b', s)
    ['#abc', 'abc', '@ef']
    
      #abc
     ^ ^
    \B \b
    

    【讨论】:

    • 哇。我以为我理解正则表达式,但这个阻碍了我。您能否解释一下为什么我的答案是错误的,以及您的解决方案到底改进了什么。还是一头雾水
    【解决方案2】:

    (@#)? 组说这个词可能以“@#”开头。您要查找的是[@#]?,即第一个字符是@ 或#,但这不是必需的。如果您需要比赛成为组的一部分,您可以使用(@|#)?

    【讨论】:

    • 嗨,亚历克斯,我只使用 [],我错误地写了 ()。我已经完成了编辑。
    【解决方案3】:

    我也会加入我的固定正则表达式版本不捕获组(因为你似乎没有使用它们):

    r'[@#]?\b(?:abc|ef|ghij)\b'
    

    见我的demo

    解释[@#] 是非单词字符,由于? 是可选的。 \b可选的,正则表达式引擎首先使用它,即它使用正确的@#,但它们不是匹配的一部分,因为\b 始终是零宽度.

    以下是来自Regular-Expressions.info 的有关\b 的更多详细信息:

    元字符 \b 是类似于插入符号和美元符号的锚。 它在称为“单词边界”的位置匹配。这场比赛 零长度

    有资格作为单词边界的三个不同位置:

    • 在字符串的第一个字符之前,如果第一个字符是 字字符。
    • 在字符串的最后一个字符之后,如果最后一个 character 是一个单词字符。
    • 在字符串中的两个字符之间, 其中一个是单词字符,另一个不是单词字符。

    【讨论】:

    • @VaidAbhishek:请查看我的解释。它很简洁,regular-expressions.info 上有一篇很好的文章。
    猜你喜欢
    • 2015-11-16
    • 2022-07-06
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多