<p>我有一个工作的正则表达式,它给了我想要的结果,但它不包含它需要的安全性。(防傻)</p>
<p>假设我有一个匹配路径部分的regex,大致如下:</p>
<pre><code>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')
</code></pre>
<p>我希望能够替换<em>匹配任何字符,直到regex</em>的以下部分与一个或多个文件夹匹配。</p>
<p>假设为了简单起见,我们将文件夹定义为以斜线结尾的单词字符(一个或多个):</p>
<pre><code>[\w]*/
</code></pre>
<p>我想把这些归为0到10组,我该怎么做?</p>
<p>在我的脑海里我有这样的想法(注意,这不起作用!)以下内容:</p>
<pre><code># 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]*/]?)
</code></pre>
<p>编辑:</p>
<p>根据RedBaron和jamylak的回答,我得出了以下结论:</p>
<pre><code>((?:[:\w]+/){0,3})
</code></pre>
<p>这将把零到三个出现的字符组合成以斜线“/”结尾的[:\w]字符。和那个?:在组的开头,它不会被发送回匹配的组。所以,结合它们的外群是。因此我们只能得到完全分组的结果。</p>
<p>唯一的问题是我希望最后一部分也可能匹配一个文件。(所以不要以斜杠结尾)我甚至更喜欢从正则表达式中去掉尾部斜杠,但是我也可以很容易地去掉结果末尾的斜杠。</p>
<p>任何反馈都非常感谢。如果是这样的话,我会加上它作为答案。</p>
<p>编辑:</p>
<p>它与<a href="https://stackoverflow.com/questions/15531977/finding-folders-back-based-on-a-predefined-folder-structure">Finding folders back based on a predefined folder structure</a>有关</p>
<p><strong>更新/编辑:</strong></p>
<p>基于目前给出的所有答案,我已经做了各种尝试,但最终都以极其缓慢的速度结束。</p>
<pre><code>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'
</code></pre>
<p>我不知道怎么加快速度!</p>