python中的正则表达式,匹配html标记之外的单词

时间:2013-02-27 02:33:07

标签: python html regex

我正在尝试使用正则表达式匹配短语,只要该短语中没有任何单词出现在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)

使用该正则表达式,我得到以下输出:

   [('', '', '')]

当我将正则表达式更改为(*注意外部的parens)时:

   regexp = "(Babb(?!([^<]+)?>).+?Jonathan(?!([^<]+)?>).+?C(?!([^<]+)?>))"
   page = urllib2.urlopen(url).read()
   re.findall(regexp, page, re.DOTALL)

我明白了:

   [('Babb, Jonathan C', '', '', '')]

我很困惑为什么会这样。

1)为什么我将这些空字符串作为匹配? 2)为什么第一个正则表达式,我没有得到实际的匹配?

最后,

我该如何解决这个问题?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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重复此过程。