我有一个工作正则表达式给了我想要的结果,但它并没有包含它所需要的安全性。 (防呆)Python正则表达式在模式内出现零次或多次出现
比方说,我有一个匹配的路线的部分地区,东西线沿线的一个正则表达式:我希望能够更换匹配任何字符了,直到
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})
这将组0到3个以斜杠'/'结尾的字符[:\ w]。使用?:在组的开头不会被发送回匹配的分组。所以,结合他们的外部团体是。因此我们只得到完全分组的结果。
唯一的问题是,我希望最后一部分也可能匹配一个文件。 (所以不要以斜杠结尾。)我甚至更喜欢将它从正则表达式中删除,但我也可以轻松地删除结果的结尾。
任何反馈,非常感谢。如果这是要走的路,我会将其添加为答案。
编辑:
它涉及到:Finding folders back based on a predefined folder structure
UPDATE /编辑:
基于迄今为止给出的所有答案,我想出了各种各样的尝试,但他们最终所有结果都极其缓慢。
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'
我并不完全知道如何加快速度!
请显示“路径”示例的所需输出。 – 2013-03-21 10:31:49
从我的问题的顶部示例代码给出的输出是所需的输出。但是我想为比赛添加更多的功能,所以我可以更精确地定义它。例如,只匹配两到四个文件夹。 – 2013-03-21 10:55:48