我有一个有效的正则表达式,它给了我想要的结果,但它不包含它需要的安全性。(万无一失)
假设我有一个匹配路径部分的正则表达式,类似于:
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')
我希望能够用匹配一个或多个文件夹的东西替换匹配任何字符,直到正则表达式的以下部分。
假设我们为简单起见将文件夹定义为以斜杠结尾的单词字符(无或更多),它将是:
[\w]*/
我想将其中的零到十个分组,我该怎么做?
在我的脑海中,我有类似的东西(请注意,这不起作用!):
# 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})
这会将零到三个以斜杠“/”结尾的 [:\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'
我不完全确定如何加快速度!