python findall只查找最后一次出现

时间:2014-02-07 06:21:12

标签: python regex

我正在尝试使用Python 2.7.5从网页中提取一些数据。

代码:

p = re.compile(r'.*<section\s*id="(.+)">(.+)</section>.*')
str = 'df  <section id="1">2</section> fdd <section id="3">4</section> fd'
m = p.findall(str)
for eachentry in m:
    print 'id=[{}], text=[{}]'.format(eachentry[0], eachentry[1])

输出:

id=[3], text=[4]

为什么它只提取最后一次出现?如果我删除最后一个出现的第一个出现

2 个答案:

答案 0 :(得分:5)

开头的.*非常贪婪,它会消耗到最后一次出现。事实上,表达式中的所有.*都非常贪婪。所以,我们使用?非贪婪,就像这样

p = re.compile(r'.*?<section\s*id="(.+?)">(.+?)</section>.*?')

输出变为

id=[1], text=[2]
id=[3], text=[4]

实际上,您可以删除第一个和最后一个.*模式并保持简单,就像这样

p = re.compile(r'<section\s*id="(.+?)">(.+?)</section>')

答案 1 :(得分:1)

您的正则表达式需要更改如下:

p = re.compile(r'<section\s*id="(.+?)">(.+?)</section>')