我不清楚您实际上是否要进行任何命名组匹配-在您描述的用途中,photoid是删除功能的输入,命名组的目的是“输出”,即从中提取某些子字符串匹配的字符串(并在match对象中按名称访问它们)。因此,我建议一种更简单的方法:
import re
import os
def delete_thumbnails(photoid, photodirroot):
matcher = re.compile(r'^%s\d+\D.*jpg$' % photoid)
numdeleted = 0
for rootdir, subdirs, filenames in os.walk(photodirroot):
for name in filenames:
if not matcher.match(name):
continue
path = os.path.join(rootdir, name)
os.remove(path)
numdeleted += 1
return "Deleted %d thumbnails for %r" % (numdeleted, photoid)
您可以将photoid作为普通字符串传递,也可以作为RE模式传递,如果您需要一次删除多个可匹配的ID(例如,在一次r'abc[def]调用中删除abcd,abce和abcf),这就是我从字面上将其插入RE模式,而不是插入字符串re.escape(photoid)像通常那样。某些部分(例如计算删除次数和最后返回信息性消息)显然是多余的,如果在用例中没有任何附加价值,则应删除这些部分。
强烈建议在Python中采用其他方式,例如“ if not ... // Continue”模式(扁平比嵌套好):一旦确定无事可做,就循环到循环的下一段这比嵌套要在if)中完成的操作要好,尽管代码的其他安排当然也可以工作。