嗨,我有一个正则表达式<a href="(.+?)" class="nextpostslink">
此Regex在以下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">»</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last »</a>
</div> </div>
我要提取的部分是<a href="http://cinemassacre.com/category/avgn/page/2/" class="nextpostslink">
但是当我在这个HTML块上运行这个regex时'>
<span class='pages'>Page 2 of 12</span><a href="http://cinemassacre.com/category/avgn/" class="previouspostslink">«</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">»</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last »</a>
</div>
</div>
它提取从第一个<a href="
到" class="nextpostslink">
为什么会这样?我想(+?)是非贪婪的,所以它应该提取最小的量。
应该是<a href="http://cinemassacre.com/category/avgn/page/3/" class="nextpostslink">
im使用的完整python代码是match=re.compile('<a href="(.+?)" class="nextpostslink">', re.DOTALL).findall(pagenav)
据我所知,贪婪从正则表达式的开始就起作用,也就是说,它找到
<a href="
,然后不贪婪就停止在第一个" class="nextpostslink">
,而不是像贪婪版本那样的最后一个。在您最好在此处使用BeautifulSoup:
从某种意义上说,比赛的开始总是贪婪的。这是因为引擎尝试在主题字符串中从左到右进行匹配。遇到第一个
<a href="
,这很好,然后引擎继续使用.+?
消耗所有内容,直到匹配完成(由于.+?
,它会尽快停止)。但它并没有尽可能地把比赛开始的越右越好,因为比赛很好。因此,可以说使用?
使匹配的结束不清晰(获取匹配的第一个可能的结束),但是匹配的开始将始终是贪婪的(无论您如何尝试使其取消锐化,匹配始终从最左边的可能位置开始)。在这就是为什么通常有一个更好的方法来代替不整洁的重复:从重复中排除分隔符:
这永远不会超过结束符
"
,因此不必担心属性或标记之外的任何内容都将成为匹配的一部分。在无论如何,让我补充一下,that you should not use regular expressions to parse HTML.如果使用}(就像在给定示例中的第二个锚标记中那样)呢?如果属性之间有多个空格怎么办?如果属性多于
'
而不是{href
和class
怎么办?如果class
属性列在href
属性之前怎么办?在jdotjdot的答案有一个很好的例子,说明了如何在Python中正确地执行它。在
它不是贪婪的。{{{cdex>引擎必须找到匹配的所有内容。在
相关问题 更多 >
编程相关推荐