提取文件路径(而非URL)的常规正则表达式

时间:2019-03-04 19:38:45

标签: python regex

我正在尝试使用Python解析文件中的url和文件路径。我已经有一个网址正则表达式。

问题

我想要一个从字符串提取文件路径的正则表达式模式。要求:

  • 独占(不包含网址)
  • 与操作系统无关,即Windows和UNIX样式路径,例如(C:\\\/
  • 所有路径类型,即绝对路径和相对路径,例如(/../

请在下面修改我的尝试或提出改进模式的帮助。

尝试

这是我到目前为止拥有的regex

(?:[A-Z]:|\\|(?:\.{1,2}[\/\\])+)[\w+\\\s_\(\)\/]+(?:\.\w+)*

说明

  • (?:[A-Z]:|\\|(?:\.{1,2}[\/\\])+):前面的驱动器号,反斜杠或点划线
  • [\w+\\\s_\(\)\/]+:任何类似路径的字符-字母数字,斜杠,括号,下划线,...
  • (?:\.\w+)*:可选扩展名

结果

enter image description here

注意:我已经在Python中使用字符串输入列表和re模块确认了这些结果。

预期

此正则表达式满足我的大多数要求-即在提取大多数文件路径时排除url。但是,我想匹配所有 路径(包括以单个斜杠开头的UNIX样式路径,例如/foo/bar.txt)而不匹配url。

研究

我没有找到一般的解决方案。大多数工作倾向于满足特定情况。

SO帖子

外部站点

1 个答案:

答案 0 :(得分:1)

您可以将问题分为3种替代模式: (请注意,我并未对路径/文件名实施所有字符排除)

  • 未引用Windows路径
  • 引用的Windows路径
  • unix路径

这将给出如下信息:

((((?<!\w)[A-Z,a-z]:)|(\.{1,2}\\))([^\b%\/\|:\n\"]*))|("\2([^%\/\|:\n\"]*)")|((?<!\w)(\.{1,2})?(?<!\/)(\/((\\\b)|[^ \b%\|:\n\"\\\/])+)+\/?)

细分:

Wind-Non-Quoted: ((((?<!\w)[A-Z,a-z]:)|(\.{1,2}\\))([^\b%\/\|:\n\"]*))
Wind-Quoted:     ("\2([^%\/\|:\n\"]*)")
Unix:            ((?<!\w)(\.{1,2})?(?<!\/)(\/((\\\b)|[^ \b%\|:\n\"\\\/])+)+\/?)


Wind-Non-Quoted:
    prefix: (((?<!\w)[A-Z,a-z]:)|(\.{1,2}\\))
         drive: ((?<!\w)[A-Z,a-z]:) *Lookback to ensure single letter*
      relative: (\.{1,2}\\))
      path: ([^\b%\/\|:\n\"]*))     *Excluding invalid name characters (The list is not complete)*

Wind-Quoted:
    prefix: \2                *Reuses the one from non-Quoted*
      path: ([^%\/\|:\n\"]*)  *Save as above but does not exclude spaces*

Unix:
    prefix: (?<!\w)(\.{1,2})?                . or .. not preceded by letters
      path: (?<!\/)                          repeated /name (exclusions as above)
            (\/((\\\b)|[^ \b%\|:\n\"\\\/])+) not preceded by /
            \/?                              optionally ending with /

            *(excluding the double slashes is intended to prevent matching urls)*