Python正则表达式在字边界处不匹配

时间:2015-04-10 13:38:29

标签: python regex

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

我在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。

3 个答案:

答案 0 :(得分:2)

您需要将您所做的[@#]旁边的单词边界设为可选。因为在此#abc部分中,\B不是单词字符)之前和行开头之后存在非单词边界#(< em>不是单词字符)不是单词边界\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

答案 1 :(得分:0)

小组(@#)?说这个词可能以“@#”开头。你要找的是[@#]?,它说第一个字符是@或#,但它不是必需的。如果您需要将匹配作为群组的一部分,则可以使用(@|#)?

答案 2 :(得分:0)

我还会投入我的固定正则表达式的版本,而不会捕获组(因为您似乎没有使用它们):

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

查看我的demo

说明[@#]是非单词字符,由于?而是可选的。 \b 是可选的,正则表达式引擎首先使用它,即它消耗权@#,但它们不是匹配的一部分,因为{{ 1}}总是零宽度

以下是Regular-Expressions.info \b的详细信息:

  

元字符\ b是一个像插入符和美元符号的锚。   它匹配一个名为&#34;字边界的位置&#34;。这场比赛   是零长度

     

有三种不同的职位符合词边界:

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