Python正则表达式,匹配太多

时间:2012-12-04 19:43:01

标签: python html regex

嗨,我有一个正则表达式 <a href="(.+?)" class="nextpostslink">

此正则表达式适用于以下html
'> <span class='pages'>Page 1 of 12</span><span class='current'>1</span><a href='http://cinemassacre.com/category/avgn/page/2/' class='page larger'>2</a><a href='http://cinemassacre.com/category/avgn/page/3/' class='page larger'>3</a><a href='http://cinemassacre.com/category/avgn/page/4/' class='page larger'>4</a><a href='http://cinemassacre.com/category/avgn/page/5/' class='page larger'>5</a><a href="http://cinemassacre.com/category/avgn/page/2/" class="nextpostslink">&raquo;</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last &raquo;</a> </div> </div>

我想要提取的部分是来自
的下一页网址 <a href="http://cinemassacre.com/category/avgn/page/2/" class="nextpostslink">

但是当我在这个HTML块上运行这个正则表达式时 '> <span class='pages'>Page 2 of 12</span><a href="http://cinemassacre.com/category/avgn/" class="previouspostslink">&laquo;</a><a href='http://cinemassacre.com/category/avgn/' class='page smaller'>1</a><span class='current'>2</span><a href='http://cinemassacre.com/category/avgn/page/3/' class='page larger'>3</a><a href='http://cinemassacre.com/category/avgn/page/4/' class='page larger'>4</a><a href='http://cinemassacre.com/category/avgn/page/5/' class='page larger'>5</a><a href="http://cinemassacre.com/category/avgn/page/3/" class="nextpostslink">&raquo;</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last &raquo;</a> </div>
</div>


它提取从第一个<a href="" class="nextpostslink">的所有内容 为什么会这样?我认为(。+?)不贪心,所以它应该提取最小量。
哪个应该是<a href="http://cinemassacre.com/category/avgn/page/3/" class="nextpostslink">

我正在使用的完整python代码是match=re.compile('<a href="(.+?)" class="nextpostslink">', re.DOTALL).findall(pagenav)

3 个答案:

答案 0 :(得分:3)

从某种意义上说,比赛的开始总是贪婪的。这是因为引擎尝试在主题字符串中从左到右匹配。遇到第一个<a href=",这很好,然后引擎继续使用.+?消耗所有内容,直到匹配完成(由于.+?,它会尽快停止)。但它并没有尽可能地尽可能地开始比赛,因为比赛很好。因此,您可以说使用?使匹配的结束成为ungreedy(获取匹配的第一个可能结束),但匹配的开始永远是贪婪的(无论你怎么试图让它不合适,比赛总是从最左边的位置开始)。

这就是为什么通常有一个更好的替代方法来解决重复问题:从重复中排除分隔符:

<a href="([^"]*)" class="nextpostslink">

这永远不会超过结束",因此无需担心属性或标记之外的任何内容都会成为匹配的一部分。

让我添加,that you should not use regular expressions to parse HTML.如果使用'而不是"(如给定示例中的第二个锚标记),该怎么办?如果属性之间有多个空格怎么办?如果有更多属性而不只是hrefclass怎么办?如果class属性列在href属性之前,该怎么办?

jdotjdot的答案有一个很好的例子,说明如何在Python中以正确的方式做到这一点。

答案 1 :(得分:3)

据我所知,贪婪从正则表达式的开头起作用 - 即它找到<a href=",然后非贪婪使它停在第一 {{ 1}}而不是 last ,就像贪婪版本一样。

最好在这里使用BeautifulSoup

" class="nextpostslink">

答案 2 :(得分:1)

  

它从第一个开始提取所有内容   为什么会这样?我认为(。+?)不贪心,所以它应该提取最小量

不贪心。但是,您拥有强制class="nextpostslink">正则表达式的事实会强制引擎匹配所有内容,直到找到class="nextpostslink">