问题,可能不容易用正则表达式解决,是我希望能够从任意字符串中提取Windows文件路径。我能够得到的最接近的(我已经尝试了一堆其他方法(是使用以下正则表达式:
[a-zA-Z]:\([a-zA-Z0-9() ]*\)*w*.*w*
它选取文件的开头,旨在查看字符串的模式(在初始驱动器号之后(,后跟反斜杠并以文件名、可选点和可选扩展名结尾。
困难在于接下来会发生什么。由于最大路径长度为 260 个字符,因此我只需要计算开头之外的 260 个字符。但是由于文件名中允许空格(和其他字符(,我需要确保没有额外的反斜杠来指示前面的字符是文件夹的名称,并且后面的内容不是文件名本身。
我很确定没有一个完美的独孤(完美是好的敌人(,但我想知道是否有人可以提出"最佳可能"的解决方案?
这是我根据你的表达式得到的表达式,它允许我在 Windows 上获取路径:[a-zA-Z]:\((?:[a-zA-Z0-9() ]*\)*).*
.使用它的一个例子可以在这里找到: https://regex101.com/r/SXUlVX/1
首先,我将捕获组从([a-zA-Z0-9() ]*\)*
更改为((?:[a-zA-Z0-9() ]*\)*)
。
您的原始表达式一个接一个地捕获每个XXX
(例如:Users
Users
(。
我的匹配(?:[a-zA-Z0-9() ]*\)*
.这使我可以在捕获之前捕获XXXYYYYZZZ
的串联。因此,它允许我获得完整的路径。
我所做的第二个更改与文件名有关:我将只匹配不包含的任何字符组(捕获组很贪婪(。这允许我处理奇怪的文件名。
另一个可以工作的正则表达式是:[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
是目录路径