【问题标题】:Matching patterns for folder names in a path, excluding a chunk of the path from matching?路径中文件夹名称的匹配模式,不包括匹配路径的一部分?
【发布时间】:2018-05-15 17:27:32
【问题描述】:

假设一个初始 (Unix) 路径 [segment] 像 /var/log。在此路径下,可能有一整棵目录树。用户使用 Unix shell 样式的通配符为文件夹名称提供模式,例如*var*。遵循初始路径 [segment] 下的模式的文件夹应使用正则表达式进行匹配,将完整路径作为输入,即必须从匹配中排除初始路径段。

我将如何构建一个正则表达式来做到这一点?


我正在使用 Python,它提供 fnmatch 模块为 part of its standard libraryfnmatch 提供了一个 translate 方法,它将使用 Unix shell 样式通配符指定的模式转换为正则表达式:

>>> fnmatch.translate('*var*')
'(?s:.*var.*)\\Z'

我想用它来构建我的正则表达式。

匹配的输入路径可能如下所示:

  • /var/log/foo/var/bar
  • /var/log/foo/avarb/bar
  • /var/log/var/

不匹配的输入路径可能如下所示:

  • /var/log
  • /var/log/foo/bar

根本问题是我必须向第三方模块pyinotify 提供正则表达式作为输入。我无法通过仅剥离初始路径段然后与其余部分匹配来解决此问题...

【问题讨论】:

    标签: python regex path directory pyinotify


    【解决方案1】:

    您应该可以像这样使用negative look behind

    (?<!^\/)var
    

    在进行正则表达式时,正面和负面的回望都非常有用。 这里还有一个交互式示例,因此您可以了解它如何与视觉反馈一起工作:https://regex101.com/r/52sZjw/1 另一个例子https://regex101.com/r/F023eD/1/ 不完全确定如何将它与 fnmatch 一起使用。看起来您最终可能会自己构建字符串,即用户输入将匹配您要排除的部分路径。

    【讨论】: