2015-05-13 279 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 /子目錄」而不是「目錄/子目錄/子目錄」)

我希望這將有助於。