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 。

打印输出(调用函数时打印 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 回答