我正在尝试使用正则表达式匹配短语,只要该短语中没有任何单词出现在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)为什么第一个正则表达式,我没有得到实际的匹配?
最后,
我该如何解决这个问题?
提前感谢您的帮助。
答案 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
(?!)
.+?>
)。 <+?>
.+?
Jonathan
和C
重复此过程。