2015-05-13 284 views
0

例如,如果我有一个路径列表(即.dir1/subdirA,dir2/subdirB,dir1/subdirB等)。我有一个正则表达式来匹配一些目录名称,然后是另一个正则表达式来匹配子目录。获得有效路径的最佳方式是什么?或者有没有办法使用2个现有的正则表达式来组合这两个正则表达式?正则表达式匹配目录然后匹配子目录

DIR_RE = re.compile(r'somedirname', re.I) 

SUB_RE = re.compile(r'^/somesubdir$', re.I) 
+2

您需要提供正在使用的正则表达式以及您希望匹配/丢弃的一些示例数据。由于这个问题非常广泛。 – npinti

+0

简单地连接它们''somedirname \/somesubdir'',然后将这个正则表达式应用于整个列表到目录路径。 – ZdaR

+0

在一般情况下,您应该更喜欢[glob](https://docs.python.org/2/library/glob.html)。但你应该提供更多的细节。 – alain

回答

2
import re 

directories = ["dir1/subdirA", "dir2/subdirB", "dir1/subdirB", "subdir9/dirC"] 

expression = re.compile('^dir[1-9]\/subdir[A-Z]$', re.I) 

for directory in directories: 
    if (re.match(expression, directory)): 
     print "Yes the directory path :" +directory+ " is valid" 
     #Do something. 
     #Passed cases = ["dir1/subdirA", "dir2/subdirB", "dir1/subdirB"] 
    else: 
     #Failed cases = ["subdir9/dirC"] 
     #Do something here. 

注:创建正则表达式牢记的情况下,提供的示例目录结构是不同的,你必须相应地改变它。

+0

这是非常有用的,但不是我所期待的。如果我有DIR_RE = re.compile(r'dir [1-9]',re.I)和SUB_RE = re.compile(r'subdir [AZ]',re.I),是否有将这两个现有的正则表达式? – user2378481

+0

我经常使用re.compile(),但我不知道它接受了第二个参数。它是为了什么? – SebasSBM

+0

我明白了。适用于不区分大小写的正则表达式。我在这里看到https://docs.python.org/2/library/re.html#re.compile – SebasSBM

0

你可以用这种方式组合这两个正则表达式。这个例子是基于@ZdaR提出的解决方案的替代方案。

import re 
directories = ["dir1/subdirA", "dir2/subdirB", "dir1/subdirB", "subdir9/dirC"] 

regexp = re.compile('^(dir[1-9])\/(subdir[A-Z])$', re.I) 

for path in directories: 
    frag = regexp.match(path) 
    if frag != None: 
     dir_str = frag.group(1) 
     subdir_str = frag.group(2) 
     entire_match = frag.group(0) 
     # Do something with them 

注意正则表达式中的括号。这些括号允许在正则表达式中定义几个组,因此每个匹配的片段可以使用group(n)方法通过Match对象获得。

这个规则表达式假定每个路径的长度将只有2

(如:“DIR /子目录”而不是“目录/子目录/子目录”)

我希望这将有助于。