1

上手。私はそれを考え出した。一致するはずのないifが正確に実行されないことが判明しました。これは、_s3_bucket.list(prefix=basename)=[]が原因です。Pythonへの信頼が回復しました。:) 皆さん、ありがとうございました!

このコードスニペットが「一致しない」と表示されないのはなぜですか?正規表現が一致すると、「一致」が正常に出力されますが、一致しない場合は、elseは実行されません。print type(match)を返します<type 'list'>

object_regex = re.compile('%s\.(\d+)\.%s' % \
    (re.escape('.'.join(basename.split('.')[:-2])),
     re.escape(basename.split('.')[-1])))
for obj in _s3_bucket.list(prefix=basename):
    match = object_regex.findall(obj.name)
    print match //prints nothing when nothing is found. not even []
    if match:
        print "matches"
    else:
        print "doesnt match"

私も試しました

if not match:
    print "doesnt match"
else:
    print "matches"

そして、ifのどちらかを実行することはありません。

Printout(UPLOAD TO S3は、関数が呼び出されたときに印刷されます):

UPLOAD TO S3 /fonts/HelveticaNeueLTPro-Lt.1351206175.otf
[u'1351206175']
matches
UPLOAD TO S3 /fonts/HelveticaNeueLTPro-Bd.1351206175.otf
[u'1351206175']
matches
UPLOAD TO S3 /css/common.1357015625.css      <-- what is going on here?
UPLOAD TO S3 /css/landing-style.1356896077.css
[u'1356896077']
matches

print type(match)の代わりに毎回print match取得するとき、それは私が一致が確かに空のリストであると信じるように導きます。<type 'list'>しかし、空のリストはこれを行うことになっています...

>>> match=[]
>>> if match:
...     print "ASDF"
... 
>>> if not match:
...     print "asdf"
... 
asdf
4

3 に答える 3

2

の戻り値findallはリストです。REにグループがある場合、ドキュメントによると、一致しないものの空のグループエントリが含まれている可能性があります。グループを使用しているため、空のタプルのリストが返される場合があります。ただし、リストは空ではないため、Trueと評価されます。関係なく。

これを表示するには、findallの戻り値を出力します。デバッグ用に印刷するのが一般的な方法です。それが私が最初に考えることです。

また

メソッド_s3_bucket.list(prefix=basename)は反復するものを何も返さず、ループブロック全体がスキップされます。その出力は何ですか?

しかし

REを動的に構築し、実際にどのように見えるか、またはどのように一致するかがわからないため、実際にはわかりません。

于 2013-01-01T05:16:33.027 に答える
0

一致するものがない場合、関数findallは[]を返します。次の例:

>>> import re
>>> res = re.findall('\d','ad34hsfg2')
>>> print res
['3', '4', '2']
>>> res = re.findall('\d','adhsfg')
>>> print res
[]
>>> print res == None
False
>>> print res == 0
False

だから、今私はあなたが理解する必要があると思います。私はあなたの質問に答えますか?

于 2013-01-01T05:27:22.690 に答える
0

実際の問題は、 []であるはずだった_s3_bucket.list(prefix=basename)ときに==[]でした。object_regex.findall(obj.name)したがって、if/elseは実行されません。なぜかわからないのですが、タイプを印刷してもまだ印刷されています...しかし、正規表現と一致しないように設定するのを忘れたと思います。

基本的に、if / elseが機能していないように見える場合、その制御フローはおそらくその前に何かによって遮断されています!

みんな、ありがとう!そして...明けましておめでとうございます!

于 2013-01-01T06:28:35.993 に答える