Python中的正则表达式,匹配HTML标签外的单词
我正在尝试用正则表达式匹配一个短语,但前提是这个短语中的任何单词都不能出现在HTML标签内。
在这个例子中,我使用了以下网址:
url = "http://www.sidley.com/people/results.aspx?lastname=B"
我使用的正则表达式是:
regexp = "Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>)"
page = urllib2.urlopen(url).read()
re.findall(regexp, page, re.DOTALL)
用这个正则表达式,我得到了以下输出:
[('', '', '')]
当我把正则表达式改成这样(注意外面的括号):
regexp = "(Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>))"
page = urllib2.urlopen(url).read()
re.findall(regexp, page, re.DOTALL)
我得到了:
[('Babb, Jonathan C', '', '', '')]
我对这个结果感到困惑。
1) 为什么我会得到这些空字符串作为匹配结果?
2) 为什么在第一个正则表达式中,我没有得到实际的匹配结果?
最后,
我该怎么解决这个问题?
提前感谢你的帮助。
1 个回答
4
你得到空字符串的原因是因为你使用了非贪婪模式。如果你不想要这些信息,只需去掉一些括号。实际上,你应该考虑使用不分组的括号,或者去掉一些多余的括号。
我会使用的最终代码(整个过程)是:
import re
import urllib2
url = 'http://www.sidley.com/people/results.aspx?lastname=B'
regexp = 'Babb(?!<+?>).+?Jonathan(?!<+?>).+?C(?!<+?>)'
page = urllib2.urlopen(url).read()
re.findall(regexp, page, re.DOTALL)
下面是对正则表达式的详细解释:
- 我们选择第一个单词。
Babb
- 我们不想匹配任何HTML标签,所以我们使用一个不匹配的反组。
(?!)
- 在这里,我们放入一个选择HTML标签的正则表达式(不太确定为什么这个特定的表达式有效,而不是
.+?>
)。<+?>
- 我们选择至少一个额外的字符,采用非贪婪模式。
.+?
- 我们对其他单词(
Jonathan
和C
)重复这个过程。