に出くわすとすぐに、**ディレクトリ構造全体を再帰する必要があるため、その時点で最も簡単な方法は、ディレクトリを os.walk で反復処理し、パスを作成してから確認することだと思います柄が合っていれば。おそらく、次のような方法で正規表現に変換できます。
def glob_to_regex(pat, dirsep=os.sep):
dirsep = re.escape(dirsep)
print re.escape(pat)
regex = (re.escape(pat).replace("\\*\\*"+dirsep,".*")
.replace("\\*\\*",".*")
.replace("\\*","[^%s]*" % dirsep)
.replace("\\?","[^%s]" % dirsep))
return re.compile(regex+"$")
(ただし、これは完全な機能ではないことに注意してください[a-z]。たとえば、スタイル glob パターンはサポートされていませんが、おそらく追加される可能性があります)。(最初のmatch は、 matchingの\*\*/ようなケースをカバーするだけでなく、末尾でのみ一致する必要がある場合にも対応します。)\*\*/CVS./CVS\*\*
ただし、パターンを処理していないときに、現在のディレクトリの下のすべてを再帰したくないことは明らか**なので、2段階のアプローチが必要になると思います。私は以下を実装しようとはしていません。おそらくいくつかのまれなケースがありますが、うまくいくはずです:
ディレクトリ区切り記号でパターンを分割します。すなわちpat.split('/') -> ['**','CVS','*']
ディレクトリを再帰的に調べて、このレベルのパターンの関連部分を調べます。すなわち。n levels deep -> look at pat[n].
pat[n] == '**'上記の戦略に切り替える場合:
- でパターンを再構築する
dirsep.join(pat[n:])
- で正規表現に変換します
glob\_to\_regex()
- 現在のディレクトリを再帰的
os.walkに通過し、開始したレベルに相対的なパスを構築します。パスが正規表現と一致する場合は、それを生成します。
pat が一致せず"**"、それがパターンの最後の要素である場合、一致するすべてのファイル/ディレクトリを生成しますglob.glob(os.path.join(curpath,pat[n]))
pat が一致せず"**"、それがパターンの最後の要素ではない場合は、ディレクトリごとに (グロブで) 一致するかどうかを確認しpat[n]ます。もしそうなら、深さをインクリメントして、それを再帰します(したがって、それは になりますpat[n+1])