在python中获取正则表达式的所有实例

时间:2013-07-26 22:36:37

标签: python regex

我正在尝试使用以下

获取所有链接innerHTML
import re

s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
match = re.findall(r'<a.*>(.*)</a>', s)

for string in match:
    print(string)

但我只是最后一次出现,“转到第4页” 我认为它会看到一个大字符串和几个匹配的正则表达式,它们被视为重叠并被忽略。那么,我如何得到一个匹配

的集合

['转到第1页','转到第2页','转到第3页','转到第4页']

3 个答案:

答案 0 :(得分:2)

你当前的问题是regexp是贪婪的,也就是说他们会尝试使用最长的字符串。所以你是正确的,直到它可以找到最后</a>。将其更改为非贪婪(.*?):

match = re.findall(r'<a.*?>(.*?)</a>', s)
                             ^

然而,这是解析HTML的一种可怕方式,并且不够健壮,并且会在最小的变化中突破。

这是一个更好的方法:

from bs4 import BeautifulSoup

s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
soup = BeautifulSoup(s)
print [el.string for el in soup('a')]
# [u'Go to 1', u'Go to page 2', u'Go to page 3', u'Go to page 4']

然后,您可以使用它的强大功能来获取href以及文本,例如:

print [[el.string, el['href'] ]for el in soup('a', href=True)]
# [[u'Go to 1', 'page1.html'], [u'Go to page 2', 'page2.html'], [u'Go to page 3', 'page3.html'], [u'Go to page 4', 'page4.html']]

答案 1 :(得分:2)

我会避免使用正则表达式以所有成本解析HTML。根据原因查看this articlethis SO post。但总结一下......

  

每当你试图用正则表达式解析HTML时,邪恶的孩子就会为处女的鲜血哭泣,而俄罗斯黑客会把你的webapp用来捣乱你的webapp

相反,我会看一下像BeautifulSouppyquery这样的python HTML解析包。它们提供了很好的界面来遍历,检索和编辑HTML。

答案 2 :(得分:1)

我建议使用lxml:

from lxml import etree

s = 'some html'
tree = etree.fromstring(s)
for ele in tree.iter('*'):
    #do something

它为大文件进程提供iterParse函数,也可以像urllib2.request对象一样接受类文件对象。我一直在使用它来解析html和xml。

请参阅:http://lxml.de/tutorial.html#the-element-class