Python中的正则表达式问题

2 投票
6 回答
1237 浏览
提问于 2025-04-11 09:14

好的,我正在写一个正则表达式,用来查找网站中的所有头部信息。

我已经编写了这个正则表达式:

regex = re.compile(r'''
    <h[0-9]>\s?
    (<a[ ]href="[A-Za-z0-9.]*">)?\s?
    [A-Za-z0-9.,:'"=/?;\s]*\s?
    [A-Za-z0-9.,:'"=/?;\s]?
''',  re.X)

在我用Python的正则表达式测试工具运行它时,效果非常好。

这里有一些示例数据:

<body>
    <h1>Dog </h1>
    <h2>Cat </h2>
    <h3>Fancy </h3>
    <h1>Tall cup of lemons</h1>
    <h1><a href="dog.com">Dog thing</a></h1>
</body>

在REDemo中,它也运行得很好。

但是,当我把它放到我的Python代码里时,它只打印出<a href="dog.com">

这是我的Python代码,我不确定我是不是哪里做错了,或者是不是在转换过程中出了问题。感谢你的帮助。

stories=[]
response = urllib2.urlopen('http://apricotclub.org/duh.html')
html = response.read().lower()
p = re.compile('<h[0-9]>\\s?(<a href=\"[A-Za-z0-9.]*\">)?\\s?[A-Za-z0-9.,:\'\"=/?;\\s]*\\s?[A-Za-z0-9.,:\'\"=/?;\\s]?')
stories=re.findall(p, html)
for i in stories:
    if len(i) >= 5:
        print i 

我还要提到的是,当我把正则表达式中的(<a href=\"[A-Za-z0-9.]*\">)?去掉时,它对非链接的<hN>行也能正常工作。

6 个回答

2

因为锚点标签周围有大括号,所以那部分被当作一个捕获组来处理。这就导致只有捕获组的内容被返回,而不是整个正则表达式的匹配结果。

如果把整个正则表达式放在大括号里,你会发现正确的匹配结果会作为返回元组中的第一个元素出现。

不过,确实应该使用一个真正的解析器。

4

用正则表达式解析东西适合处理常规语言,但HTML并不是常规语言。现在网页上的内容往往很乱。BeautifulSoup这个工具可以处理这种杂乱的HTML,它的工作方式像浏览器一样,所以解析出来的HTML看起来更像浏览器显示的内容。

不过,它的速度不是特别快。如果你要解析格式正确的HTML,可以用lxml,但如果你不完全确定输入的HTML总是格式正确,还是建议使用BeautifulSoup。

23

最近几天,有很多人问过这个问题,所以我想说得很清楚。

问:我该如何用正则表达式解析HTML?

答:请不要这样做。

请使用 BeautifulSouphtml5liblxml.html。拜托了。

撰写回答