に出くわすとすぐに、**
ディレクトリ構造全体を再帰する必要があるため、その時点で最も簡単な方法は、ディレクトリを 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]
)