2
str1='<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"'
str2='<a href="/states/florida/433" title="florida">'
pat = re.compile('/states/.*/([^"]+)')
if ( pat.findall(str2) == pat.findall(str1)):
    print "TRUE"
else:
    print "FALSE"

出力:FALSE、

output2 :433
output1:abc.com

誰かが説明できますか?

4

4 に答える 4

3

.*?貪欲なものの代わりに消極的な量指定子を使用してください -.*そしてすべてがうまくいくでしょう: -

pat = re.compile('/states/.*?/([^"]+)')

量指定子はデフォルトでgreedyです。つまり、可能な限り多くの文字列をカバーしようとし、残りの文字列に一致するように残りのパターンを残します。?量指定子の後に使用するとreluctantになります。この場合、次の文字の最初の一致で停止し/ます。この場合です。

于 2013-01-30T18:35:48.267 に答える
1

あなたの正規表現は正しく機能しています:

<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"
         ^^^^^^^^............................................................^^^^^^^
         /states/                      .*/                                     [^"]+

と:

<a href="/states/florida/433" title="florida">
         ^^^^^^^^........^^^

最初のケースで文字列全体を消費したくない場合は、?貪欲でない一致量指定子である を使用して、「最初/states/の文字までの任意の数の文字が続き、その後に 1 つ以上の非引用符文字が続きます」と言います。 /

于 2013-01-30T18:39:01.823 に答える
1

最初の URL では、正規表現は文字列全体と一致します:

<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com
         /states/                                .*                         /([^"]+)

そしてそうではない

<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com
         /states/ .*   /([^"])+

彼らは貪欲で.*、できるだけ多くのデータを食べます。

于 2013-01-30T18:36:05.747 に答える
0

あなたのパターンは貪欲です(貪欲および非貪欲な正規表現パターンについては、http://docs.python.org/2/library/re.htmlおよびここ:http://www.itworld.com/nlで読むことができます。 / perl/01112001。パターンをから変更

'/states/.*/([^"]+)'

'/states/.*/([^"]+)'

trueを返します。完全に変更されたソースは次のとおりです。

import re

str1='<a href="/states/florida/433" title="florida"><img alt="florida" src="http://abc.com"'
str2='<a href="/states/florida/433" title="florida">'
pat = re.compile('/states/.*?/([^"]+)')
if ( pat.findall(str2) == pat.findall(str1)):
    print "TRUE"
else:
    print "FALSE"
于 2013-01-30T18:51:06.777 に答える