比较两个正则表达式[ab] *和([ab])\ 1

时间:2014-06-07 03:02:38

标签: python regex

令我惊讶的是

  • 为什么[ab]*不重复匹配的部分,但重复[ab]。换句话说,为什么它与a*b*不一样?

  • 为什么([ab])\1重复匹配的部分,但不重复[ab]。换句话说,为什么它只能匹配aabb,而不能匹配abba

是因为()的优先级低于[],而*的优先级高于[]?我想知道这些因为运营商可能不合适。感谢。

3 个答案:

答案 0 :(得分:1)

它们两者完全不同。

当您说[ab]*时,它表示ab为零或更多次。因此,它会匹配""," a"," b"以及ab的任意组合。

([ab])\1表示ab会匹配,然后会被捕获。 \1称为反向引用。它指的是RegEx中已经捕获的组。在我们的案例中,([ab])。因此,如果捕获了a,那么它将仅再次匹配a。如果是b,那么它将仅再次与b匹配。它只能与aabb匹配。

答案 1 :(得分:1)

[ab]*

这也不会匹配任何内容,abaaabbb以及任意长度的字符串。匹配不受长度约束,并且由于没有捕获组,因此它表示匹配由所有ab字符组成的任意长度的字符串。

([ab])\1

在这种情况下,它会强制匹配的字符串为两个字符,因为没有重复。首先,它必须与parens中的内容相匹配(用于捕获第一组),然后它必须与第1组中捕获的内容匹配,这会隐式强制匹配为两个字符长,两个字符相同。

答案 2 :(得分:1)

让我们看看你的每个表达,然后我们将添加一个有趣的转折,这可能解决任何悬而未决的混乱。

[ab]*相当于(?:a|b)*,换句话说,匹配ab任意次,例如abbbaab

[ab]相当于(?:a|b),换句话说,匹配ab一次,例如a

a*表示任意次数匹配a(例如,aaaa

b*表示任意次数匹配b(例如,bb

您说([ab])\1只能与aabb匹配。这是正确的,因为

([ab])\1表示匹配ab一次,将其捕获到第1组,然后再次匹配第1组,即a,如果我们有a,或b如果我们有b

另一种变体(Perl,PCRE)

([ab])(?1)表示匹配ab一次,将其捕获到组1,然后匹配组1中指定的表达式,因此再次匹配[ab]。这将匹配aaabbabb。因此,

([ab])(?1)*可以与[ab]+匹配,([ab]*)(?1)*可以与[ab]*匹配