我可以用dotall获得非贪婪的正则表达式吗?

时间:2012-02-29 22:41:10

标签: python regex non-greedy

我想匹配dotall和非贪心。这就是我所拥有的:

img(.*?)(onmouseover)+?(.*?)a

然而,这不是非贪婪的。这个数据不符合我的预期:

<img src="icon_siteItem.gif" alt="siteItem" title="A version of this resource is available on siteItem" border="0"></a><br><br></td><td rowspan="4" width="20"></td></tr><tr><td>An activity in which students find other more specific adjectives to 
describe a range of nouns, followed by writing a postcard to describe a 
nice holiday without using the word 'nice'.</td></tr><tr><td>From the resource collection: <a href="http://www.siteItem.co.uk/index.asp?CurrMenu=searchresults&amp;tag=326" title="Resources to help work">Drafting </a></td></tr><tr><td><abbr style="border-bottom:0px" title="Key Stage 3">thing</abbr> | <abbr style="border-bottom:0px" title="Key Stage 4">hello</abbr> | <abbr style="border-bottom:0px" title="Resources">Skills</abbr></td></tr></tbody></table></div></div></td></tr><tr><td><div style="padding-left: 30px"><div><table style="" bgcolor="#DFE7EE" border="0" cellpadding="0" cellspacing="5" width="100%"><tbody><tr valign="top"><td rowspan="4" width="60"><a href="javascript:requiresLevel0(350,350);"><img name="/attachments/3700.pdf" onmouseover="ChangeImageOnRollover(this,'/application/files/images/attach_icons/rollover_pdf.gif')" onmouseout="ChangeImageOnRollover(this,'/application/files/images/attach_icons/small_pdf.gif')" src="small_pdf.gif" alt="Download Recognising and avoiding ambiguity in PDF format" title="Download in PDF format" style="vertical-align: middle;" border="0"></a><br>790.0 k<br>

我无法理解为什么。

我认为我在上述正则表达式中的陈述是:

  

以“img”开头,然后允许0或更多任何字符包括新行,然后查找至少1“onmouseover”,然后允许0或更多任何字符,包括新行,然后是“a”

为什么这不能像我预期的那样工作?

关键点:必须启用dotall

2 个答案:

答案 0 :(得分:15)

这是非贪婪的。 你对非贪婪的理解是不正确的。

正则表达式 始终 尝试匹配。

让我举一个简单的例子,说明非贪婪的实际含义(如评论所示):

re.findall(r'a*?bc*?', 'aabcc', re.DOTALL)

这将匹配:

  • 尽可能少地重复'a'(在这种情况下为2)
  • 后跟'b'
  • 尽可能少重复'c'(在这种情况下为0)

所以唯一的匹配是'aab'

只是得出结论:

不要使用正则表达式来解析HTML。有工作的图书馆。 re不是其中之一。

答案 1 :(得分:5)

首先,你的正则表达式看起来有点时髦:你说匹配“img”,然后是任意数量的字符,“onmouseover”至少一次,但可能重复(例如“onmouseoveronmouseoveronmouseover”),后跟任何数字字符,后跟“a”。

这应该从img src="icon_一直到onmouseover="Cha。这可能不是你想要的,但这就是你要求的。

其次,这显然更为重要:

不要使用常规的EXPESSIONS PARSE HTML。

如果你第一次不理解它,让我用斜体重复一遍:

不要使用常规的EXPESSIONS PARSE HTML。

最后,让我链接到关于这个主题的规范魔法:

You can't parse [X]HTML with a regex