2015-10-16 97 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

相关问题