首页 > 解决方案 > Windows 文件路径的 Python 正则表达式

问题描述

问题是我希望能够从任意字符串中提取 Windows 文件路径,并且它可能不容易用正则表达式解决。我能够来的最接近的(我已经尝试了很多其他的)是使用以下正则表达式:

[a-zA-Z]:\\([a-zA-Z0-9() ]*\\)*\w*.*\w*

它选择文件的开头,旨在查看字符串的模式(在初始驱动器号之后),后跟反斜杠并以文件名、可选点和可选扩展名结尾。

困难在于接下来会发生什么。由于最大路径长度为 260 个字符,因此我只需要计算开头之外的 260 个字符。但是由于文件名中允许使用空格(和其他字符),我需要确保没有额外的反斜杠可以指示前面的字符是文件夹的名称,而后面的不是文件名本身.

我很确定没有完美的解决方案(完美是善的敌人),但我想知道是否有人可以提出“最好的”解决方案?

标签: pythonregexfilepath

解决方案


这是我得到的表达式,基于你的,它允许我在 windows 上获取路径:[a-zA-Z]:\\((?:[a-zA-Z0-9() ]*\\)*).*。此处提供了一个使用示例:https ://regex101.com/r/SXUlVX/1

首先,我将捕获组从 更改([a-zA-Z0-9() ]*\\)*((?:[a-zA-Z0-9() ]*\\)*)
您的原始表达式XXX\一个接一个地捕获(例如:Users\the Users\)。
我的火柴(?:[a-zA-Z0-9() ]*\\)*。这使我可以在捕获XXX\YYYY\ZZZ\之前捕获的串联。因此,它允许我获得完整的路径。

我所做的第二个更改与文件名有关:我将匹配任何不包含的字符组\(捕获组是贪婪的)。这让我可以处理奇怪的文件名。

另一个可行的正则表达式是:[a-zA-Z]:\\((?:.*?\\)*).*如本例所示:https ://regex101.com/r/SXUlVX/2

这一次,我用来.*?\\匹配XXX\路径的部分。
.*?将以非贪婪方式匹配:因此,.*?\\将匹配最少的文本,后跟反斜杠。

如果您对表达式有任何疑问,请不要犹豫。
我还鼓励您尝试使用https://regex101.com查看您的表达效果如何。这也列出了您可以在正则表达式中使用的不同标记。

编辑:由于我之前的回答不起作用(尽管我需要花一些时间来找出确切的原因),我寻找另一种方法来做你想做的事。我设法使用字符串拆分和连接来做到这一点。
命令是"\\".join(TARGETSTRING.split("\\")[1:-1])
这是如何工作的:将原始字符串拆分为子字符串列表,基于。然后我删除第一部分和最后一部分([1:-1]从第二个元素到最后一个元素)并将结果列表转换回字符串。

无论给定的值是路径还是文件的完整地址,这都有效。 Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred是文件路径 Program Files (x86)\\Adobe\\Acrobat Distiller\\acrbd.exe fred\是目录路径


推荐阅读