2

テキスト ファイル内のディレクトリの大きなリストを検索するには、 GLOB2またはFORMICのようなソリューションが必要です (ファイルはマシン上になく、ファイル リストは直接アクセスまたはクエリできない外部プロセスによって生成されます)。

擬似例:

# read the large directory list in memory
data = []
with open('C:\\log_file.txt','r') as log:
    data = log.readlines()

# query away!
query1 = listglob(data,'/**/fnord/*/log.*')
query2 = listglob(data,'/usr/*/model_*/fnord/**')

誰かからの提案がない限り、私の次のステップは glob2 と formic を開いて、そのうちの 1 つをルート フォルダーの代わりにリストを受け入れるように変更して「os.walked」にするかどうかを確認することです。

4

3 に答える 3

2

正規表現を使用することをお勧めします。最終的に、Formic とglobOS 呼び出しの両方を使用して、実際のグロブ マッチングを実行します。そのため、いずれかを変更したい場合は、RE マッチャー (または類似のもの) をいずれにせよ作成する必要があります。したがって、中間業者を切り捨てて、RE に直行します。(私は Formic の作者なので、そう言うのはつらいです)。

基本的な計画は、glob を受け取り、正規表現を返す関数を作成することです。ここにいくつかのポインタがあります:

  1. .および、-およびグロブ内のその他の RE 予約文字をエスケープします。例えば.\.
  2. ?グロブ ファイル/ディレクトリの Aは[^/](ではない単一の文字に一致します/)になります
  3. 正規表現としての glob ファイル/ディレクトリ名の A*[^/]*
  4. /*/正規表現としてのグロブは次のとおりです。/[^/]+/
  5. /**/正規表現としてのグロブは次のとおりです。/([^/]+/)*
  6. 行全体に一致させるには、RE を a で開始し、^で終了し$ます。これにより、RE が文字列全体に展開されます。

複雑になる順に置換をリストしましたが、次の順序で置換を行うことをお勧めします。

  1. グロブではない特殊な RE 文字 ( .-、「$」など)
  2. ?
  3. /**/
  4. /*/
  5. *

/**/このようにして、単一の を置き換えるときにが破損することはありません*

あなたの質問には次のものがあります/**/fnord/*/log.*。これは次のようにマッピングされます。

^/([^/]+/)*fnord/[^/]+/log\.[^/]*

RE を作成したら、一致するものを見つけるのは簡単です。

于 2013-11-15T01:06:14.607 に答える
0

が構文glob2.fnmatch.fnmatchと同等だとは思わない。glob2 **

fnmatchソースコードを読んでわかる構文と同等です。

また、アンドリューの答えは角括弧をカバーしていません。そして[!abc]

于 2015-09-23T03:48:28.703 に答える