【问题标题】:Python regular expression for Windows file pathWindows 文件路径的 Python 正则表达式
【发布时间】:2018-09-25 19:31:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: python regex file path


【解决方案1】:

这是我得到的表达式,基于你的,它允许我在 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() ]*\\)*。这允许我在捕获之前捕获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\是目录路径

【讨论】:

  • 这会产生相同的输出,尽管更干净,但真正的问题是找到路径的尽头。例如,如果我输入:c:\Program Files (x86)\Adobe\Acrobat Distiller\acrbd.exe fred 它在路径中包含“fred”。我不确定是否有任何好的方法可以单独使用正则表达式来做我想做的事情。我可能需要从驱动器号开始将 260 个字符读入缓冲区,然后对其进行后处理以确定路径的结束位置和无关文本的开始位置。
  • 添加了一个非正则表达式版本来执行此操作,而我正在使用我的正则表达式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多