Python中的正则表达式,匹配HTML标签外的单词

1 投票
1 回答
586 浏览
提问于 2025-04-17 17:16

我正在尝试用正则表达式匹配一个短语,但前提是这个短语中的任何单词都不能出现在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标签的正则表达式(不太确定为什么这个特定的表达式有效,而不是.+?>)。<+?>
  • 我们选择至少一个额外的字符,采用非贪婪模式。.+?
  • 我们对其他单词(JonathanC)重复这个过程。

撰写回答