嗨,我有一个正则表达式
<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">»</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块上运行这个正则表达式时
'>
<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">
我正在使用的完整python代码是match=re.compile('<a href="(.+?)" class="nextpostslink">', re.DOTALL).findall(pagenav)
答案 0 :(得分:3)
从某种意义上说,比赛的开始总是贪婪的。这是因为引擎尝试在主题字符串中从左到右匹配。遇到第一个<a href="
,这很好,然后引擎继续使用.+?
消耗所有内容,直到匹配完成(由于.+?
,它会尽快停止)。但它并没有尽可能地尽可能地开始比赛,因为比赛很好。因此,您可以说使用?
使匹配的结束成为ungreedy(获取匹配的第一个可能结束),但匹配的开始永远是贪婪的(无论你怎么试图让它不合适,比赛总是从最左边的位置开始)。
这就是为什么通常有一个更好的替代方法来解决重复问题:从重复中排除分隔符:
<a href="([^"]*)" class="nextpostslink">
这永远不会超过结束"
,因此无需担心属性或标记之外的任何内容都会成为匹配的一部分。
让我添加,that you should not use regular expressions to parse HTML.如果使用'
而不是"
(如给定示例中的第二个锚标记),该怎么办?如果属性之间有多个空格怎么办?如果有更多属性而不只是href
和class
怎么办?如果class
属性列在href
属性之前,该怎么办?
jdotjdot的答案有一个很好的例子,说明如何在Python中以正确的方式做到这一点。
答案 1 :(得分:3)
据我所知,贪婪从正则表达式的开头起作用 - 即它找到<a href="
,然后非贪婪使它停在第一 {{ 1}}而不是 last ,就像贪婪版本一样。
最好在这里使用BeautifulSoup:
" class="nextpostslink">
答案 2 :(得分:1)
它从第一个开始提取所有内容 为什么会这样?我认为(。+?)不贪心,所以它应该提取最小量
不贪心。但是,您拥有强制class="nextpostslink">
正则表达式的事实会强制引擎匹配所有内容,直到找到class="nextpostslink">
。