2017-04-04 57 views
2

我試圖找出一種方法來比較每個目錄路徑與給定的正則表達式以找出它是否匹配該模式。如何檢查給定的路徑名​​是否與Python中給定的正則表達式匹配

我的路徑

C:\Dir 
C:\Dir\data 
C:\Dir\data\file1 
C:\Dir\data\file2 
C:\Dir\data\match1\file1 
C:\Dir\data\match1\file2 

我只想打印那些符合下列模式 是路徑,其中「*」可替代零個或多個目錄級別和MATCH1可以是在下面的列表文件或目錄的名稱。

C:\Dir\*\match1 

我想通了,re.match()會幫助我走出這一點,但我有一個困難時期試圖找出如何定義模式,我想出了一個(粘貼下面)根本不起作用。 項目將包含引號

re.match("((C:\\)(Dir)\\(.*)\\(match1))",item) 

路徑是否有人可以幫助我完成這個任務?

+0

其實'*'部分不是*正則表達式*。 –

+1

看看下面的文章。我認爲它應該可以幫助你: http://stackoverflow.com/questions/43096014/search-for-any-number-of-unknown-substrings-in-place-of-in-a-list-of-string/ 43096243#43096243 – ma3oun

回答

1

你可以去:

^C:\\Dir\\.+?match1.* 

a demo on regex101.com


Python,這將是:

import re 

rx = re.compile(r'C:\\Dir\\.+?match1.*') 

files = [r'C:\Dir', r'C:\Dir\data', r'C:\Dir\data\file1', r'C:\Dir\data\file2', r'C:\Dir\data\match1\file1', r'C:\Dir\data\match1\file2'] 

filtered = [match.group(0) 
      for file in files 
      for match in [rx.match(file)] 
      if match] 

print(filtered) 

或者,如果你喜歡filter()lambda()

filtered = list(filter(lambda x: rx.match(x), files)) 
+1

非常感謝你@Jan,你的表情只做了一點修改,C:\\ Dir \\。+?match1。*是我想要的模式。它必須在包含C:\ Dir \ match1的任何級別上匹配。此路徑不會與。+ :) –

+0

@DhiwakarRavikumar:很高興幫助:) – Jan

0

你的正則表達式是:

^C:\\Dir\\.*match1 

的解釋是:

C:\\Dir\\是啓動路徑的子串

.*路徑中的任何其他符號

match1的東西后(文件或目錄)

0

因爲我還沒有的口碑評論說去明確的名稱,我會在這裏評論。

@Jan提出的解決方案適用於所討論路徑的特定列表,但如果作爲通用解決方案應用,則存在一些問題。如果路徑列表如下:

>>> print paths 
C:\Dir 
C:\Dir\data 
C:\Dir\match1 
C:\Dir\data\file1 
C:\Dir\data\match1\file1 
C:\Dir\data\match1\file2 
C:\Dir\data\abcmatch1def\file3 
C:\Dir\data\file1\match12 
C:\Dir\data\file1\match1 
>>> 

的(R'C:?\風向\ + MATCH1 *')不匹配 「C:\風向\ MATCH1」 併產生假陽性,即「 C:\ Dir \ data \ abc match1 def \ file3「和」C:\ Dir \ data \ file1 \ match1 2「。

提出的解決方案:

>>> import re 
>>> for line in paths.splitlines(): 
...  if re.match(r"C:\\Dir.*\\match1(\\|$)", line): 
...    print line 
... 
C:\Dir\match1 
C:\Dir\data\match1\file1 
C:\Dir\data\match1\file2 
C:\Dir\data\file1\match1 
>>> 
相關問題