Skip to main content
 首页 » 编程设计

Python 正则表达式在模式中出现零次或多次

2024年08月29日32lidabo

我有一个有效的正则表达式,可以提供我想要的结果,但它不包含所需的安全性。 (防呆)

假设我有一个匹配部分路径的正则表达式,类似于:

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]*/ 

我想将其中的 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}) 

这会将零到三个以斜杠“/”结尾的 [:\w] 字符分组。使用 ?: 在组的开头,它不会被发送回匹配的分组。因此,结合它们的外部群体是。因此我们只能得到完全分组的结果。

唯一的问题是我希望最后一部分也可能匹配一个文件。 (所以不以斜杠结尾。)我什至更喜欢在没有正则表达式尾部斜杠的情况下取回它,但我也可以轻松地去掉结果末尾的斜杠。

非常感谢任何反馈。如果这是要走的路,我会将其添加为答案。

编辑:

相关于:Finding folders back based on a predefined folder structure

更新/编辑:

根据目前给出的所有答案,我进行了各种尝试,但最终都非常缓慢。

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' 

我不完全确定如何加快速度!

请您参考如下方法:

正则表达式中的 [] 不会对正则表达式进行分组。它用于指定字符类。

也许这会奏效-

\w*/{0,10} 

对于分组,只需使用 ()

(\w*/){0,10} 

编辑

根据您编辑的问题,我认为您想要的是目录名称匹配 0-3 次,然后文件名也匹配。

假设文件名中只有字母(以及可选的最多三个字符的扩展名)

^((?:[:\w]+/){0,3})(\w+(?:\.\w{1,3})?)?$ 

这个很大,但可以分成两部分

这是你已经拥有的

((?:[:\w]+/){0,3}) 

还有我添加的

(\w+(?:\.\w{1,3})?)? 

这是最后一个可选的文件名。 (如果它不是可选的,您可以删除最后一个 ?)。文件名本身可以仅由字母组成,也可以具有最多 3 个字符的扩展名

添加 ^ 和 $ 将停止虚假匹配

>>> pat=re.compile('^((?:[:\w]+/){0,3})(\w+(?:\.\w{1,3})?)?$') 
>>> my_str='fwefw/wfwf/wefwf/dde.cdf' 
>>> pat.search(my_str).groups() 
('fwefw/wfwf/wefwf/', 'dde.cdf') 
>>> my_str='fwefw/dde.cdf' 
>>> pat.search(my_str).groups() 
('fwefw/', 'dde.cdf')