Python 用于提取文件路径(而不是URL)的通用正则表达式
我正在尝试使用Python解析文件中的URL和文件路径。我已经有了一个url正则表达式 问题 我想要一个从字符串中提取文件路径的正则表达式模式。要求:Python 用于提取文件路径(而不是URL)的通用正则表达式,python,regex,Python,Regex,我正在尝试使用Python解析文件中的URL和文件路径。我已经有了一个url正则表达式 问题 我想要一个从字符串中提取文件路径的正则表达式模式。要求: 独占(不包括URL) 独立于操作系统,即Windows和UNIX风格的路径,例如(C:\,\\,/) 所有路径类型,即绝对路径和相对路径,例如(/,。/) 请通过修改我下面的尝试或建议改进的模式来帮助我 尝试 以下是我到目前为止所做的工作: (?:[A-Z]:|\\|(?:\.{1,2}[\/\\])+)[\w+\\\s_\(\)\/]+(?
- 独占(不包括URL)
- 独立于操作系统,即Windows和UNIX风格的路径,例如(
,C:\
,\\
)/
- 所有路径类型,即绝对路径和相对路径,例如(
,/
)。/
(?:[A-Z]:|\\|(?:\.{1,2}[\/\\])+)[\w+\\\s_\(\)\/]+(?:\.\w+)*
描述
:前面的任何驱动器号、反斜杠或虚线路径(?:[A-Z]:\\\\\\(?:\.{1,2}[\/\\]])+)
:任何类似路径的字符-字母数字、斜杠、空格、下划线[\w+\\\s\(\)\/]+
:可选扩展名(?:\。\w+)*
re
模块确认了这些结果
期望
这个正则表达式满足了我的大多数要求——即在提取大多数文件路径时排除URL。但是,我希望在不匹配URL的情况下匹配所有路径(包括以单斜杠开头的UNIX样式的路径,例如/foo/bar.txt
)
研究
我还没有找到一个普遍的解决办法。大多数工作倾向于满足特定情况
所以张贴
- 不带引号的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,您确实不能在文件名的名称部分包含/
,除非将其放在名称的末尾……在其他位置,它将被解释为路径中的分隔符)。我很欣赏这项工作。您的方法与我的大多数测试相匹配()。但是,大多数都在执行多个捕获。相反,我认为您需要多个非捕获组和一个捕获组来提取内聚文件路径。请参阅备选方案:。此外,您是否能够解决剩余的边缘情况?