python - Windows 文件路径的 Python 正则表达式
问题描述
问题是我希望能够从任意字符串中提取 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\
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\
是目录路径
推荐阅读
- php - GET 表单是否有等效的全局变量 $_FILES?
- sql - 为唯一工厂选择最近的非 Null 值的 SQL 帮助
- c# - 当我在没有给出任何值的情况下按 Enter 时,我希望返回给我第一种情况,但它给了我第二种情况
- java - 尝试在 Java 中解析日期时间“02-APR-18 09.26.21”时出现异常
- python - 随机模块方法 Python
- python - 合并两个用冒号分隔的文件
- mysql - 如何在 MYSQL 中有空值的 GROUP_CONCAT 将字段从 LEFT JOIN?
- python - 如何在 python 中修复此错误“与 MySQL 数据库的连接错误”
- python - 如何检查类方法是否返回自我?
- android - Flutter:如何实时监听权限