1

我正在尝试使用正则表达式匹配一个短语,只要该短语中的任何单词都没有出现在 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)为什么对于第一个正则表达式,我没有得到实际匹配?

最后,

我该如何解决?

在此先感谢您的帮助。

4

1 回答 1

4

您得到空字符串的原因是您使用的是non-greedy。如果您不想要该信息,只需删除一些括号。事实上,你真的应该研究非分组括号或只是一些无关的对。


我将使用(用于整个过程)的最终代码是

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)重复这个过程。
于 2013-02-27T02:40:50.283 回答