import re
test_paths = [
'a/b/c/../../x',
'a/b/c/../../x/..',
'a/b/c/../../../x',
'a/b/c/../../../../x',
'a/b/c/../../../../x/',
'a/b/c/../../../../x///',
'a/b/c/../../q/a/b/c/../../../../../x',
'//a/b/c/../../q/a/././b/./c/../../..////../../../../../x',
]
for path in test_paths:
print "INPUT: ", path
path = '/' + path # secure from missing root
path = re.sub(r'/+', '/', path) # remove any slash repetitions
path = re.sub(r'(?<!\.)\.(?:/|$)', '', path) # remove any "./"
while True: # remove any "dir/../"
pp = re.sub(r'\w+\/\.\.(?:/|$)', '', path)
if pp == path: # NB: we have to do this in a
break # loop until path remains unchanged
else: # to cope with input like this:
path = pp # '/a/b/../c/../../d'
path = re.sub(r'\.\.(?:/|$)', '', path) # remove oustanding '../' (cf. '/a/../../b')
path = re.sub(r'/$', '', path) # remove trailing slash
print "CANONICAL: ", path
aW1wb3J0IHJlCgp0ZXN0X3BhdGhzID0gWwoJJ2EvYi9jLy4uLy4uL3gnLAoJJ2EvYi9jLy4uLy4uL3gvLi4nLAoJJ2EvYi9jLy4uLy4uLy4uL3gnLAoJJ2EvYi9jLy4uLy4uLy4uLy4uL3gnLAoJJ2EvYi9jLy4uLy4uLy4uLy4uL3gvJywKCSdhL2IvYy8uLi8uLi8uLi8uLi94Ly8vJywKCSdhL2IvYy8uLi8uLi9xL2EvYi9jLy4uLy4uLy4uLy4uLy4uL3gnLAoJJy8vYS9iL2MvLi4vLi4vcS9hLy4vLi9iLy4vYy8uLi8uLi8uLi8vLy8uLi8uLi8uLi8uLi8uLi94JywKXQoKZm9yIHBhdGggaW4gdGVzdF9wYXRoczoKCXByaW50ICJJTlBVVDogIiwgcGF0aAoJcGF0aCA9ICcvJyArIHBhdGgJCQkJCQkJIyBzZWN1cmUgZnJvbSBtaXNzaW5nIHJvb3QKCXBhdGggPSByZS5zdWIocicvKycsICcvJywgcGF0aCkJCQkJIyByZW1vdmUgYW55IHNsYXNoIHJlcGV0aXRpb25zCglwYXRoID0gcmUuc3ViKHInKD88IVwuKVwuKD86L3wkKScsICcnLCBwYXRoKQkjIHJlbW92ZSBhbnkgIi4vIgoJd2hpbGUgVHJ1ZToJCQkJCQkJCQkjIHJlbW92ZSBhbnkgImRpci8uLi8iCgkJcHAgPSByZS5zdWIocidcdytcL1wuXC4oPzovfCQpJywgJycsIHBhdGgpCgkJaWYgcHAgPT0gcGF0aDoJCQkJCQkJIyBOQjogd2UgaGF2ZSB0byBkbyB0aGlzIGluIGEKCQkJYnJlYWsJCQkJCQkJCSMgbG9vcCB1bnRpbCBwYXRoIHJlbWFpbnMgdW5jaGFuZ2VkCgkJZWxzZToJCQkJCQkJCQkjIHRvIGNvcGUgd2l0aCBpbnB1dCBsaWtlIHRoaXM6CgkJCXBhdGggPSBwcAkJCQkJCQkjICcvYS9iLy4uL2MvLi4vLi4vZCcKCXBhdGggPSByZS5zdWIocidcLlwuKD86L3wkKScsICcnLCBwYXRoKQkJIyByZW1vdmUgb3VzdGFuZGluZyAnLi4vJyAoY2YuICcvYS8uLi8uLi9iJykKCXBhdGggPSByZS5zdWIocicvJCcsICcnLCBwYXRoKQkJCQkjIHJlbW92ZSB0cmFpbGluZyBzbGFzaAoJcHJpbnQgIkNBTk9OSUNBTDogIiwgcGF0aA==