2

こんにちは私は正規表現を持っています
<a href="(.+?)" class="nextpostslink">

この正規表現は、次のhtmlで正常に機能します
'> <span class='pages'>Page 1 of 12</span><span class='current'>1</span><a href='http://cinemassacre.com/category/avgn/page/2/' class='page larger'>2</a><a href='http://cinemassacre.com/category/avgn/page/3/' class='page larger'>3</a><a href='http://cinemassacre.com/category/avgn/page/4/' class='page larger'>4</a><a href='http://cinemassacre.com/category/avgn/page/5/' class='page larger'>5</a><a href="http://cinemassacre.com/category/avgn/page/2/" class="nextpostslink">&raquo;</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last &raquo;</a> </div> </div>

私が抽出しようとしている部分は、次のページのURLです。
<a href="http://cinemassacre.com/category/avgn/page/2/" class="nextpostslink">

しかし、この正規表現をHTMLのこのブロックで実行すると
'> <span class='pages'>Page 2 of 12</span><a href="http://cinemassacre.com/category/avgn/" class="previouspostslink">&laquo;</a><a href='http://cinemassacre.com/category/avgn/' class='page smaller'>1</a><span class='current'>2</span><a href='http://cinemassacre.com/category/avgn/page/3/' class='page larger'>3</a><a href='http://cinemassacre.com/category/avgn/page/4/' class='page larger'>4</a><a href='http://cinemassacre.com/category/avgn/page/5/' class='page larger'>5</a><a href="http://cinemassacre.com/category/avgn/page/3/" class="nextpostslink">&raquo;</a><span class='extend'>...</span><a href='http://cinemassacre.com/category/avgn/page/12/' class='last'>Last &raquo;</a> </div>
</div>


<a href="それは最初から すべてを抽出します" class="nextpostslink">
なぜこれが起こるのですか?(。+?)は欲張りではないと思ったので、最小限の量を抽出する必要があります。
私が<a href="http://cinemassacre.com/category/avgn/page/3/" class="nextpostslink">

使用している完全なPythonコードは
match=re.compile('<a href="(.+?)" class="nextpostslink">', re.DOTALL).findall(pagenav)

4

3 に答える 3

3

あなたの試合の始まりは、ある意味で常に貪欲です。これは、エンジンがサブジェクト文字列の左から右への一致を試行するためです。最初<a href="に遭遇しましたが、これは問題ありません。その後、エンジンが先に進み、試合が完了するまですべてを消費します.+?(のため、できるだけ早く停止します.+?)。しかし、試合はうまくいくので、可能な限り試合を開始しようとはしません。したがって、を使用?すると試合の終わりが貪欲にならなくなる(試合の最初の可能な終わりを取る)と言うことができますが、試合の開始は常に貪欲になります(試合は常に可能な限り左端の位置から始まりますそれを貪欲にしないようにしてください)。

これが、貪欲でない繰り返しのより良い代替手段がしばしばある理由です。繰り返しから区切り文字を除外します。

<a href="([^"]*)" class="nextpostslink">

これは終了を超えることはできない"ため、属性またはタグの外側にあるものが一致の一部になることを心配する必要はありません。

とにかく、HTMLを解析するために正規表現を使用するべきではないことを付け加えておきます。(与えられた例の2番目のアンカータグのように)の'代わりに使用された場合はどうなりますか?"属性間に複数のスペースがある場合はどうなりますか?とだけではなく、より多くの属性がある場合はどうhrefなりclassますか?class属性が属性の前にリストされている場合はどうなりhrefますか?

jdotjdotの答えには、Pythonで正しい方法でそれを行う方法の良い例があります。

于 2012-12-04T19:47:06.287 に答える
3

私が理解しているように、貪欲は正規表現の最初から機能します。つまり、を見つけ、次に、貪欲バージョンのように、非貪欲は最後のものではなく最初<a href="のもので停止します。 " class="nextpostslink">

ここでBeautifulSoupを使用するのが最善です:

from bs4 import BeautifulSoup as BS
soup = BS(html)
print soup.find("a", "nextpostslink").attrs['href']
# returns u'http://cinemassacre.com/category/avgn/page/2/'
于 2012-12-04T19:49:38.470 に答える
1

それは最初からすべてを抽出しますなぜこれが起こるのですか?(。+?)は欲張りではないと思ったので、最小限の量を抽出する必要があります

欲張りではありません。ただし、必須の正規表現があるという事実によりclass="nextpostslink">、エンジンはが見つかるまですべてに一致するように強制されますclass="nextpostslink">

于 2012-12-04T19:47:11.010 に答える