是否有可能只使用python正则表达式来解决这个问题?

时间:2017-04-20 08:38:10

标签: python regex

https://codefights.com/interview/wqveBLtNtfByaEnfW

虽然我理解如何使用for循环来解决这个问题,但我想知道我是否只能使用正则表达式来解决问题。

我已经尝试了以下但是它不起作用......

import re

def simplifyPath(path):
    path = re.sub(r'/[a-zA-Z]{1,}/\.\./', '/', path)
    path = re.sub(r'//' , '/', path)
    path = re.sub(r'/\./', '/', path)
    return path

2 个答案:

答案 0 :(得分:0)

虽然我们可能会详细说明一些棘手的正则表达式(使用递归和PyPi正则表达式):

(?<=\/)\/|(?<!\.)\.(?:\/|$)|((?:\w+\/)\g<1>?\.\.(?:\/|$))|\/+$

它会相当复杂,可能仍未覆盖所有边缘情况:请参阅demo

应用一系列简单的正则表达式似乎是最可行的解决方案:

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

演示:https://ideone.com/I5B084

答案 1 :(得分:-1)

为什么在有python时使用正则表达式。 正则表达式可调试性差,可读性差。 我之所以给它,是因为很多错误和语言不好

在python中它只是dirs = split(“/”)然后从头开始吃dirs。

testdirs=["a/b/../c/d/e/./f","p/q/r/..","e/../..","e/."]
for dir in testdirs:
    simpdir=dir.split("/")
    out=[]
    for branch in simpdir:
        if branch=="..":
            if len(out)!=0:
                out.pop(-1)
        elif branch!=".":
            out.append(branch)
    print "/".join(out)