2014-03-07 66 views
1

我正在使用python。我的問題是我有幾個字符串,我必須檢測他們的哪一部分看起來像一條路徑,然後規範化那些實際路徑。
例如我有幾個不同的字符串喜歡如下:
1. .. \ .. \ .. \工作區
2. C:\源\工作區
3. -B .. \ .. \源
4. - 建立.. \ .. \工作\源.. \工作區
5. -HD:\ ABC \ BDS \工作區
基本上一些字符串是路徑通俗易懂和一些具有尾隨 - 附連到它們。選項字符串的長度是可變的。
在上面的例子中,字符串3,4,5包含一個預先附加了選項-B,-build,-H的路徑字符串。
問題是如何從上面的例子中檢測出,字符串的哪部分是路徑,哪部分不是。選項不固定,所以我不能只檢查給定的字符串的頭部預先指定的選項。
要繼續前進的唯一方法是從..開始的子字符串或之前的一個字符(例如C:或D :)。


所以問題是,是否有任何這樣做的一般化的方式或python提供任何函數來從任何特定位置開始截取字符串的一部分?

滿足上述5個例子的任何答案都很酷,即使它有點過度擬合。查找字符串是否爲路徑

我目前使用的代碼例如2和5是:path = path[path.find(':')-1:] 和其他的path = path[path.find('.'):]。但是這不是一般化和不酷的。所以我正在尋找更好的算法或解決方案。

+0

的是're.split'甚或'str.split'什麼 –

+0

分裂?拆分需要拆分一些字符 – tejas

+0

您無法檢測路徑名。例如,在linux上,路徑允許包含除'\ 0'之外的任何字符。唯一被處理的字符是'\ 0',因爲這會終止字符串,而'/'被用作路徑分量分隔符,但這後一個事實並不重要/幫助... – pasztorpisti

回答

0

如果你沒有的選項已知列表,我不認爲你可以有100%可靠的算法。

如果我們用一些合理的猜測去,我能想到的是這樣的:

  • 如果不下手 - ,這是一個路徑
  • 如果它開始 - ,刪除第一信和使用os.path。存在於其餘部分,如果返回true,則直到你得到非字母數字字符

某些情況下,這打破了,你有路徑之上

  • 重複:

    • 我們真的有一個路徑,但它並沒有在文件系統
    • 存在不妨多吃的驅動器盤符,並檢查錯誤的驅動器
    • 上存在的路徑,如果選項可以包含非字母數字字符
    • 參數是在當前目錄
  • +0

    是的。考慮到它的窗口,這個算法在幾個地方出現了問題,這是一個很難的問題。 – tejas

    0

    權的文件或文件夾,我覺得一個工具,你需要在列表切片力學

    我們初始化字符串:

    string = "a/b/c/d" 
    

    如果我們想要訪問例如第一個兩個要素,那麼我們會這樣做:

    sub_string = string[:2] 
    

    如果我們想訪問最後兩個元素的話,就要用:

    sub_string = string[-2:] 
    

    更多列表切片http://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python/

    希望幫助:)

    +0

    是我正在使用path = path [path.find(':') - 1:]代碼示例2和5.以及其他人的路徑=路徑[path.find('。'):] – tejas

    0

    使用此功能,我創建:

    import os 
    
    string_1 = 'adsflk;ajewqpfoiewjqfpowijapfeiojC:\Python27' 
    
    def parse_path(string): 
        count = 0 
        while True: 
         count += 1 
         new_string = string.split(string[:count], 1) 
         if os.path.exists(new_string[1]): 
          return new_string 
          break 
    

    運行parse_path功能string_1返回'C:\Python27'。只要發送函數的任何這些字符串,它應該工作。祝你好運!在評論中提問。

    +0

    這個比我在這個問題中寫的代碼消耗更多的時間。 – tejas

    +0

    你正在尋求一個通用版本,這是一個回答你的問題。它適用於各種路徑名稱和類型,並不像您說的解決方案那樣不酷。 –

    0

    會這樣嗎?

    import os 
    
    possibles = [ 
    "..\..\..\Workspace", 
    "C:\source\Workspace", 
    "-B..\..\source", 
    "-build..\..\work\source..\workspace", 
    "-HD:\abc\bds\Workspace " 
    ] 
    
    paths = [] 
    for p in possibles: 
        if p[0] == '-': 
         if ':' in p: 
          p = p[p.index(':')-1:] 
         else: 
          cut = 2 
          while not os.path.exists(p) and p: 
           p = p[cut:] 
           cut+=1 
        if p: paths.append(p)