好。我想到了。事实证明,当它不应该匹配时if不会完全运行,那是因为_s3_bucket.list(prefix=basename)
= []。我对python的信心已经恢复。 :)谢谢大家!
为什么这段代码不能打印“不匹配”?
正则表达式匹配时,它会成功打印“匹配”,但如果没有,则不执行其他操作。 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。
打印输出(调用函数时上传到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
答案 0 :(得分:2)
findall
的返回值是一个列表。如果RE具有组,那么根据文档,它可以包括非匹配的空组条目。由于您使用的是组,因此可能会返回空元组列表。但由于列表不为空,因此计算结果为True。无论。
要显示此信息,请打印出findall的返回值。打印用于调试的东西是常见的做法。这将是我想做的第一个想法。
OR
你的方法_s3_bucket.list(prefix=basename)
没有返回任何东西来迭代并跳过整个循环块。那是什么输出?
BUT
由于您动态构建RE并且我们不知道它的真实外观或匹配内容,因此我们无法确定。
答案 1 :(得分: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
所以,现在我觉得你应该明白。 我能回答你的问题吗?
答案 2 :(得分:0)
实际问题是_s3_bucket.list(prefix=basename)
== [],object_regex.findall(obj.name)
应该是[]。因此,if / else从未执行过。我不知道为什么然后,当我打印类型时,它仍然打印...但我想我忘了设置那个与正则表达式不匹配。
基本上,如果if / else似乎不起作用,它的控制流可能会被它之前的东西切断!
谢谢大家!和...新年快乐!