9

dotall と non-greedy を一致させたいと思います。これは私が持っているものです:

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 を有効にする必要があります

4

2 に答える 2

15

貪欲でないことです。正しくないのは、貪欲でないというあなたの理解です。

正規表現は常に一致しようとします。

非貪欲が実際に意味することの簡単な例を示しましょう(コメントで示唆されているように):

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

これは一致します:

  • 「a」の繰り返しはできるだけ少なくする (この場合は 2)
  • 続いて「b」
  • 'c' の繰り返しはできるだけ少なくします (この場合は 0)。

したがって、唯一の一致は'aab'です。

結論

として、HTML の解析に正規表現を使用しないでください。仕事のために作られたライブラリがあります。reそれらの1つではありません。

于 2012-02-29T23:03:18.997 に答える
5

まず第一に、あなたの正規表現は少し奇妙に見えます: 「img」に一致し、次に任意の数の文字に一致し、「onmouseover」が少なくとも 1 回は繰り返される可能性があります (たとえば、「onmouseoveronmouseoveronmouseover」)、その後に任意の数の文字が続きます。続いて「あ」。

img src="icon_これは からまで一致するはずonmouseover="Chaです。それはおそらくあなたが望んでいるものではありませんが、あなたが求めたものです。

第二に、これは非常に重要です。

HTML の解析に正規表現を使用しないでください。

初めて理解できなかった場合は、イタリック体で繰り返します。

HTML の解析に正規表現を使用しないでください。

最後に、この件に関する正規のグリモアにリンクさせてください。

[X]HTML を正規表現で解析することはできません

于 2012-02-29T23:20:48.390 に答える