如何确保re.findall()在正确的位置停止?

时间:2013-07-20 19:15:03

标签: python regex python-2.7 findall

这是我的代码:

a='<title>aaa</title><title>aaa2</title><title>aaa3</title>'
import re
re.findall(r'<(title)>(.*)<(/title)>', a)

结果是:

[('title', 'aaa</title><title>aaa2</title><title>aaa3', '/title')]

如果我设计了一个抓取工具来获取网站标题,我可能会得到类似这样的东西,而不是网站的标题。

我的问题是,如何将findall限制为单个<title></title>

4 个答案:

答案 0 :(得分:13)

如果您只想要一场比赛,请使用re.search代替re.findall

>>> s = '<title>aaa</title><title>aaa2</title><title>aaa3</title>'
>>> import re
>>> re.search('<title>(.*?)</title>', s).group(1)
'aaa'

如果您想要所有标签,那么您应该考虑将其更改为非贪婪(即 - .*?):

print re.findall(r'<title>(.*?)</title>', s)
# ['aaa', 'aaa2', 'aaa3']     

但实际上考虑使用BeautifulSoup或lxml或类似方法来解析HTML。

答案 1 :(得分:5)

改为使用非贪婪的搜索:

r'<(title)>(.*?)<(/title)>'

问号表示匹配尽可能少的字符。现在你的findall()将返回你想要的每个结果。

http://docs.python.org/2/howto/regex.html#greedy-versus-non-greedy

答案 2 :(得分:2)

re.findall(r'<(title)>(.*?)<(/title)>', a)

?之后添加*,这样就不会贪婪。

答案 3 :(得分:1)

使用BeautifulSoup模块会更容易。

https://pypi.python.org/pypi/beautifulsoup4