2

我试图找出与文件路径字符串匹配的正则表达式模式,其中名为“cmd.exe”的文件不位于“System32”文件夹或其任何子文件夹中。

模式应与此匹配:

C:\Tools\calc.exe

但不是这个:

C:\Windows\System32\calc.exe
C:\Windows\System32\De-de\calc.exe

我尝试了负面的看法:

(?<![Ss]ystem32)\\calc\.exe
(?<![Ss]ystem32).*\\calc\.exe
(?<![Ss]ystem32[.*])\\calc\.exe

但到目前为止没有任何效果。有人看到我的错误吗?

您可以在这里查看我的示例并自己尝试一下: http ://rubular.com/r/syAoEn7xxx

谢谢你的帮助。

4

4 回答 4

5

要回答问题的正则表达式方面,问题是re不支持可变长度的lookbehinds:

rx = r'(?<!System32.*)calc.exe'
re.search(rx, r'C:\Tools\calc.exe')

> sre_constants.error: look-behind requires fixed-width pattern

有两种解决方法:

安装并使用支持该功能的较新的正则表达式模块(以及更多):

rx = r'(?<!System32.*)calc.exe'
print regex.search(rx, r'C:\Tools\calc.exe')  # <_regex.Match object at 0x1028dd238>
print regex.search(rx, r'C:\Windows\System32\calc.exe') # None

或改写表达式,使其不需要变量lookbehind:

rx = r'^(?!.*System32).*calc.exe'
print re.search(rx, r'C:\Tools\calc.exe')  # <_sre.SRE_Match object at 0x10aede238>
print re.search(rx, r'C:\Windows\System32\calc.exe') # None
于 2013-03-26T10:02:46.213 回答
1

os.path处理文件名时,您应该使用 -module 中的函数。

我建议:

from os.path import basename, dirname

paths = [r"C:\Tools\calc.exe",
         r"C:\Windows\System32\calc.exe",
         r"C:\Windows\System32\De-de\calc.exe"]

good_paths = [p for p in paths if basename(p).lower() == "calc.exe"
                               and not "system32" in dirname(p).lower()]

核心是对 的列表理解paths,检查basename(路径的最后一部分)和dirname,包含目录的名称。

于 2013-03-26T09:55:59.480 回答
0

你可以在没有正则表达式的情况下做到这一点。

def iter_good_paths(list_of_paths):
    for path in list_of_paths:
        parts = path.lower().split(r'\')
        if parts[-1] == 'calc.exe' and 'System32' in parts:
            yield path

并像这样使用它:

print list(iter_good_paths(list_of_paths)) 
于 2013-03-26T09:49:34.290 回答
0

您不需要在这里进行回顾,更不用说可变宽度了。改用前瞻:

(?i)^(?:(?!\\System32\\).)*\\calc\.exe$

\system32\这将匹配您想要 的字符串之前不包含不区分大小写的字符串的任何内容\calc.exe。表达式的(?i)部分使其右边的所有内容不区分大小写(如果这是用于 Windows 文件系统,这可能是一个不错的选择)。

我很想推荐regular-expressions.info。它是学习正则表达式的许多怪癖和风格的绝佳资源。

于 2013-03-26T09:55:31.740 回答