2016-08-17 3 views
0

ツリー構造を走査したいが、ワイルドカード式に一致する部分、つまりlaのpythonグロブ(ダブルアスタリスクは「任意の数のサブディレクトリ」を意味する)文字列が正規表現マッチのプレフィックスであるかどうかを調べる

たとえば、私のワイルドカード式は/ */foo/**/bar /です。これは/ a/foo/bar /、/ b/foo/note/bar /に一致しますが、/ a/bar/foo/bar /には一致しません。あなたはその考えを得る。

私の問題は、ツリー構造をトラバースするときに、現在のディレクトリがおそらくが接頭辞としてワイルドカード式に一致するかどうかを知る必要があるということです。ですから、/ a /、/ a/bar /ではなく/ a /ディレクトリを横断したいのですが、後者は決してワイルドカード式と一致しません。

ワイルドカード表現は、もちろん正規表現に書き換えます。

+0

プレフィックスの定義には注意が必要です。有効な一致として '/ a/fo'を受け入れるでしょうか?これは、私がペナルティであるということだけではありません。なぜなら、接頭辞をどのように定義してアルゴリズムにあなたを導くべきかについての詳細を検討すると思うからです。また、これは私に「正規表現」として当てはまらない!正規表現を適切に構築するためには、おそらく多くの考え方と注意が必要になるため、問題の種類になります。正規表現は、ここでは必ずしも有用ではありませんが、最も優雅に適用する方法を考え、単一の正規表現ですべてをキャッチしようとしないと、美しい場所へのより多くの扉を開く可能性があります。 –

+0

私にとってもっとも簡単なのは、トラバーサルが '**'に達した場合です。この場合、すべてのサブツリーは有効なプレフィックスです。 –

+0

とにかく、あなたの正規表現のサブパターンの論理グループを作成し、そのグループをリストに入れ、サブリストをマイナスして頭を下にします(そして**ケースではない)を次のレベルに渡しますあなたの木の頭が一致するとき。 –

答えて

0

次のコードを参考にしてください。私はパスの中にそれぞれの "ディレクトリ"を持っていて、一対のリストの要素としてパターンを描いていると仮定します:

def traverse(pattern_list, path_list): 
    if pattern_list[0] == '**': 
     traverse_children(pattern_list, path_list[1:]) 
    if current_matches(pattern_list[0], path_list[0]): 
     traverse_children(pattern_list[1:], path_list[1:]) 
     # Other things you might want to do in the case of a valid prefix 

def current_matches(pattern_atom, path_atom): 
    return pattern_atom in (path_atom, '*', '**') 
関連する問題