Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于提取文件路径(而不是URL)的通用正则表达式_Python_Regex - Fatal编程技术网

Python 用于提取文件路径(而不是URL)的通用正则表达式

Python 用于提取文件路径(而不是URL)的通用正则表达式,python,regex,Python,Regex,我正在尝试使用Python解析文件中的URL和文件路径。我已经有了一个url正则表达式 问题 我想要一个从字符串中提取文件路径的正则表达式模式。要求: 独占(不包括URL) 独立于操作系统,即Windows和UNIX风格的路径,例如(C:\,\\,/) 所有路径类型,即绝对路径和相对路径,例如(/,。/) 请通过修改我下面的尝试或建议改进的模式来帮助我 尝试 以下是我到目前为止所做的工作: (?:[A-Z]:|\\|(?:\.{1,2}[\/\\])+)[\w+\\\s_\(\)\/]+(?

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

问题

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

  • 独占(不包括URL)
  • 独立于操作系统,即Windows和UNIX风格的路径,例如(
    C:\
    \\
    /
  • 所有路径类型,即绝对路径和相对路径,例如(
    /
    。/
请通过修改我下面的尝试或建议改进的模式来帮助我

尝试

以下是我到目前为止所做的工作:

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

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

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

期望

这个正则表达式满足了我的大多数要求——即在提取大多数文件路径时排除URL。但是,我希望在不匹配URL的情况下匹配所有路径(包括以单斜杠开头的UNIX样式的路径,例如
/foo/bar.txt

研究

我还没有找到一个普遍的解决办法。大多数工作倾向于满足特定情况

所以张贴

外部站点


您可以将问题分为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)*

风不报价:((((?如果前面的字符是可移植的,您可以匹配它。您也不应该使用非捕获组。请尝试此操作并检查Python,或者可能添加另一个具有负查找功能的替代项来匹配前两个路径。这将非常有趣。
command.com
实际上是一个文件名和一个internet主机要确保文件名在UNIX中有效,请执行以下操作:
'\0'不在文件名中,文件名[-1]!='/'
。唯一的限制是文件名不能包含
\0
,文件名不能包含
/
(显然,其绝对路径将包含
/
)。(我可能会补充一点,使用普通API,您确实不能在文件名的名称部分包含
/
,除非将其放在名称的末尾……在其他位置,它将被解释为路径中的分隔符)。我很欣赏这项工作。您的方法与我的大多数测试相匹配()。但是,大多数都在执行多个捕获。相反,我认为您需要多个非捕获组和一个捕获组来提取内聚文件路径。请参阅备选方案:。此外,您是否能够解决剩余的边缘情况?