給定一個文件的絕對路徑(unix系統),將其簡化。
在unix文件系統中,’.’ 表示當前目錄,因此可以被忽略。’…’ 表示上一個目錄,因此需要取消掉最後一層目錄。
示例:
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
path = "/a/../../b/../c//.//", => "/c"
path = "/a//b////c/d//././/..", => "/a/b/c"
邊界示例:
- “/…/” 應該返回 “/”
- 多個斜線應該合爲一個,如 “/home//foo/” 應該返回 “/home/foo”
思路
先將斜線之間的目錄按順序提取出來,並定義一個空的結果路徑,然後從左到右進行遍歷。
- 如果遇到 ‘.’,則跳過,繼續遍歷。
- 如果遇到 ‘…’,則結果路徑中的最後一個路徑刪掉,繼續遍歷。
- 否則,將此路徑添加到結果路徑中,繼續遍歷。
最後,需要注意兩個邊界示例,因此在按斜線分隔之前,先將多個斜線合爲一個(用正則式匹配和替換);在遍歷結束之後,若爲空路徑,則改爲’/’;若最後一個字符爲斜線,則去掉。
python實現
import re
def simplifyPath(path):
"""
:type path: str
:rtype: str
先將斜線之間的目錄按順序提取出來,然後從左到右進行 . 和 .. 的分析。
"""
# 將多個斜線換成1個
pattern = re.compile(r'/{2,}')
path = re.sub(pattern, '/', path)
# 分割
splits = path.split('/')
results = []
for split in splits:
if (split == '..' and len(results) == 1) or (split == '.'):
continue
if split == '..':
results = results[:-1]
else:
results.append(split)
result = '/'.join(results)
if result == '': # 爲空時返回一個斜槓
result = '/'
elif len(result) > 1 and result[-1] == '/': # 去掉最後一個斜槓
result = result[:-1]
return result
if '__main__' == __name__:
path = "/"
print(simplifyPath(path))