我正在尝试使用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]
为什么它只提取最后一次出现?如果我删除最后一个出现的第一个出现
答案 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>')