Вот решение, которое сопоставит шаблон с полным путем, а не только с базовым именем файла.
Он использует fnmatch.translate
для преобразования шаблона стиля глобуса в регулярное выражение, которое затем сопоставляется с полным путем каждого файла, найденного при обходе каталога.
re.IGNORECASE
необязательно, но желательно в Windows, поскольку в самой файловой системе не учитывается регистр. (Я не удосужился скомпилировать регулярное выражение, поскольку в документах указано, что его следует кэшировать внутри.)
import fnmatch
import os
import re
def findfiles(dir, pattern):
patternregex = fnmatch.translate(pattern)
for root, dirs, files in os.walk(dir):
for basename in files:
filename = os.path.join(root, basename)
if re.search(patternregex, filename, re.IGNORECASE):
yield filename