我有一个简单的任务 - 我在两个字符串中给出了一个路径和一个Ant模式,我想知道路径是否适合模式。就是这样。
e.g。模式可能是
foo/*/bar/**.ext
然后会针对简单的true / false
匹配测试不同的路径。
现在我正在使用fnmatch
包,但这不能100%正确运行。它基本上将*
合并到**
并且会匹配太多文件。
我正在寻找Python或一般方法的解决方案,以生成允许我进行匹配的正则表达式。
答案 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