2015-10-16 61 views
1

我有一個簡單的任務 - 我給出了一個路徑和兩個字符串中的Ant模式,我想知道路徑是否適合模式。這就對了。與Ant路徑匹配的正則表達式

例如該圖案可以是

foo/*/bar/**.ext 

,然後不同的路徑將對於一個簡單true/false匹配進行測試。

現在我正在使用fnmatch程序包,但這不能100%正常工作。它基本上合併***並將匹配太多的文件。

我正在尋找Python解決方案或一般方法來生成正則表達式,這將允許我做匹配。

+0

要知道,「Unix的文件名模式匹配」和「正則表達式」是兩個d不同的事情。諸如'**/CVS/*'這樣的Ant風格模式在概念的「Unix文件名模式匹配」一側比在「正則表達式」一側更多。也許從你的搜索中刪除「正則表達式」將幫助你找到一個有用的庫? –

+0

@MartinMelka:沒有運氣與我的路徑翻譯正則表達式? –

+0

是的,我一直在玩類似的遊戲,但是你的解決方案似乎無論我能想到什麼都能正確匹配。我會做更多的測試:) –

回答

1

我也不敢保證這是在任何情況下一個防彈解決方案,但你可以嘗試在這個路徑上的每個字符懂事過濾:

  • .用反斜槓點\.
  • 螞蟻明星*用等效[^\/]+
  • 螞蟻雙星**用正則表達式風格.*
  • 斜線/逃脫\/(這僅適用於Unix類路徑)
  • 問號?用一字單字符\w(這僅匹配[a-zA-Z0-9_]可以比對於字符操作系統」規則允許的文件名更嚴格)

這是相關代碼:

#!/usr/bin/python 
import re 

star = r"[^\/]+" 
doubleStar = r".*" 
slash = r"\/" 
questionMark = r"\w" 
dot = r"\." 

antPath = "foo/*/bar/**.ex?" 
expectedPath = r"foo\/[^\/]+\/bar\/.*\.ex\w" 

# Apply transformation 
output = antPath.replace(r"/", slash).replace(r".", dot) 
output = re.sub(r"(?<!\*)\*(?!\*)", star, output) 
output = output.replace(r"**", doubleStar) 
output = output.replace(r"?", questionMark) 

if (output == expectedPath): 
    print "Success!" 
else: 
    print "Failure..." 
print "filteredPath: ", output 
print "expectedPath: ", expectedPath 

在線試玩here

相關問題