必要な結果が得られる正規表現が機能していますが、必要な安全性が含まれていません。(フールプルーフ)
次のようなパスの一部に一致する正規表現があるとします。
import re
path = "C:/Projects/foo/dev/model/props/furniture/couch/data/fbx"
regex = re.compile("(.+)/dev/model/(.+)/(.+)/data/fbx")
m = regex.search(path)
if m:
print m.groups()
# ('C:/Projects/foo', 'props/furniture', 'couch')
正規表現の次の部分までの任意の文字に一致するものを、1 つ以上のフォルダーに一致するものに置き換えられるようにしたいと考えています。
簡単にするために、フォルダーをスラッシュで終わる単語文字 (なしまたはそれ以上) として定義するとします。
[\w]*/
そして、それらの 0 から 10 をグループ化したいのですが、どうすればよいでしょうか?
私の心の中で、私は次のようなものを持っていました(これは機能しないことに注意してください!):
# match any number of word characters ending with a slash zero to ten times
([[\w]*/]{0,10})
# match any number of word characters ending with a slash zero to one time
([[\w]*/]?)
編集:
RedBaron と jamylak の回答に基づいて、次のことを思いつきました。
((?:[:\w]+/){0,3})
これにより、スラッシュ「/」で終わる 0 ~ 3 個の [:\w] 文字がグループ化されます。グループの先頭に ?: があると、一致したグループに送り返されません。それでも、それらを組み合わせた外側のグループはそうです。したがって、完全にグループ化された結果のみが返されます。
これに関する唯一の問題は、最後の部分もファイルと一致する可能性があることです。(したがって、スラッシュで終わらないでください。)正規表現から末尾のスラッシュなしでそれを取得することも好みますが、結果の末尾のスラッシュを簡単に削除することもできます。
フィードバックは大歓迎です。これが進むべき道である場合、私はそれを答えとして追加します。
編集:
関連項目:定義済みのフォルダー構造に基づいてフォルダーを検索する
更新/編集:
これまでに与えられたすべての回答に基づいて、さまざまな試みを思いつきましたが、最終的にはすべて非常に遅くなります。
import re
path = "C:/Projects/foo/dev/model/props/furniture/couch/data/fbx"
regex = re.compile(r"""((?:^(?:[\w:]+/?)+)|(?:(?<=/)(?:[\w]+/?)+))/dev/model/""")
print 'search start'
m = regex.search(path)
print 'search done'
if m:
print 'match', m, m.groups()
else:
print 'no match'
これを高速化する方法が完全にはわかりません!