簡體   English   中英

Windows文件路徑的Python正則表達式

[英]Python regular expression for Windows file path

這個問題(使用正則表達式可能無法輕松解決)是我希望能夠從任意字符串中提取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() ]*\\\\)* 這使我可以在捕獲之前捕獲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\\是目錄路徑

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM