为什么我的正则表达式会这样做?

时间:2016-07-24 06:35:06

标签: regex python-2.7

考虑以下文字:

foo:·····¶
·bar x··¶
·lorem ipsum····¶
dolorsitamet···¶
···¶   
consectetur adipiscing elit:

中间点表示空格,表示换行符。

正则表达式(?:foo:\s*)(.+)(?:\n\s*)匹配空白行上的三个空格,但正则表达式(?:foo:\s*)(.+)(?:\n\s+)匹配并且不包括dolorsitamet之后的换行符。为什么*角色不贪婪?可以预期第三组(?:\n\s*)匹配

¶
···¶`

我的正则表达式模式是多行,dotall。

2 个答案:

答案 0 :(得分:1)

确实表现得很贪婪。但是,为了在最后匹配inline int max(int x, int y) { return x > y ? x : y; } ,它需要匹配换行符后跟至少一个空格字符。在这种情况下,这是倒数第二个换行符,三个空格和最后一个换行符。

如果它没有停在那里,\n\s+将捕获更多,但最后一部分将不匹配,正则表达式引擎将寻找一个不太贪心的解决方案,这是它找到的。

答案 1 :(得分:1)

贪婪的本性不是问题所在。问题在于您使用:

\n\s*

由于此前.+是贪婪的,\n\s*与输入文本中的最后\n匹配,即(last-1)th行(即带有3个空格的行)并停止。

RegEx Demo 1

但是,当你使用

\n\s+

由于存在量词+,因此\n 后需要至少一个空格,因此无法与\n行中的(last-1)th匹配(因为最后一行在开始时没有任何空格。因此,它匹配以\n开头的行中的dolorsitamet,因为下一行在开头有空格。

RegEx Demo 2