Python regex,匹配太多

2024-09-29 19:24:28 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个正则表达式
<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">&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块上运行这个regex时
'> <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">


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


Tags: divcomhttppagepagesclasshrefspan
3条回答

据我所知,贪婪从正则表达式的开始就起作用,也就是说,它找到<a href=",然后不贪婪就停止在第一个" class="nextpostslink">,而不是像贪婪版本那样的最后一个。在

您最好在此处使用BeautifulSoup

from bs4 import BeautifulSoup as BS
soup = BS(html)
print soup.find("a", "nextpostslink").attrs['href']
# returns u'http://cinemassacre.com/category/avgn/page/2/'

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

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

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

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

无论如何,让我补充一下,that you should not use regular expressions to parse HTML.如果使用'而不是{}(就像在给定示例中的第二个锚标记中那样)呢?如果属性之间有多个空格怎么办?如果属性多于hrefclass怎么办?如果class属性列在href属性之前怎么办?在

jdotjdot的答案有一个很好的例子,说明了如何在Python中正确地执行它。在

It extracts everything from the first Why does this happen? I thought (.+?) was non greedy, so it should extract the minimal amount

它不是贪婪的。{{{cdex>引擎必须找到匹配的所有内容。在

相关问题 更多 >

    热门问题