Регулярное выражение Python для печати списка каталогов

#python #regex #for-loop #directory

#python #Регулярное выражение #for-цикл #каталог

Вопрос:

У меня есть список каталогов в виде списка на python со следующими данными:

 /a
/a/b
/a/b/1
/a/b/2
/a/b/3
/a/c
/a/c/1
/a/c/2
/a/c/3
/a/d
/a/d/1
/a/d/2
/f
/f/g
/f/g/h
/f/g/i
/f/g/j
  

И я хочу отобразить выходные данные в следующем формате:

 /a
    /b
        /1
        /2
        /3
    /c
        /1
        /2
        /3
    /d
        /1
        /2
/f
    /g
        /h
        /i
        /j
  

Я использую следующую функцию python, но она выводит непоследовательный вывод:

 def formatVFS(lst):
    for line in lst:
        l1 = list(lst)
        l2 = []
        if re.search(r'^/w ', line) != None:
            temp = re.search(r'^/w ', line).group()
            print 'tt', temp
            for line2 in l1:
                if line2.startswith(temp):
                    lst.remove(line2)
                    line2 = line2.replace(temp, '')
                    if line2!= '':
                        l2.append(line2)
                        print 'ttt',line2
            formatVFS(l2)
  

Есть предложения?

Комментарии:

1. «он печатает непоследовательный вывод» , пожалуйста, включите его в свой вопрос

2. Также примечание: print 't... синтаксис python2. Python 2 достиг EOL ранее в этом году. Если у вас нет веской причины использовать Python 2, вам следует использовать Python 3.

3. Я должен использовать эту программу в устаревшей системе. Поэтому невозможно изменить версию Python. Установленная версия python — 2.7.5

4. Это хорошая причина для использования Python 2 🙂

Ответ №1:

Пожалуйста, попробуйте приведенную ниже программу, она выполняет поиск и заменяет /w то, чего нет в конце строки, на tab. предполагая, что папки находятся в ожидаемом порядке. если нет, вы можете отсортировать его перед отображением.

 import re
l=["/a","/a/b","/a/b/1","/a/b/2","/a/b/3","/a/c","/a/c/1","/a/c/2","/a/c/3","/a/d","/a/d/1","/a/d/2","/f","/f/g","/f/g/h","/f/g/i","/f/g/j"]
for i in l:
    print(re.sub(r"/w (?=/(?!$))","t",i))
  

Вывод

 /a
        /b
                /1
                /2
                /3
        /c
                /1
                /2
                /3
        /d
                /1
                /2
/f
        /g
                /h
                /i
                /j
  

Комментарии:

1. Спасибо @Liju за ваш ответ. Программа отлично работает с заданным вводом, но выдает ошибку с этим типом данных / / работа / работа / архив / работа / извлечение / работа / нажатие / работа / автозапуск / работа / автозапуск / работа / распределение / работа / распределение / 1 / работа / распределение / 2 / работа /распределение / 3 / работа / распределение / 4 / работа / распределение / 5 / работа / распределение / 6 / работа / распределение / 7 / работа / распределение / 8 / работа / распределение / 9 / работа / распределение / 10 / работа / триггер

2. @FarmanAhmed когда вы просите о помощи, всегда лучше предоставить как можно больше соответствующих деталей . «Он выдает такую-то ошибку в строке x» или «он печатает abc вместо xyz» намного лучше , чем сказать «это не работает».

3. @FarmanAhmed, я обновил приведенную выше программу. пожалуйста, проверьте.

4. @Liju он по-прежнему выдает ошибку с этим типом данных / zzzAdmin / zzzAdmin / zzzAdmin_MFT1.0-vfs / zzzAdmin / zzzAdmin_MFT1.0-vfs / adhoc 1113 / zzzAdmin / zzzAdmin_MFT1.0-vfs/adhoc /fromSSC 1114 /zzzAdmin / zzzAdmin_MFT1.0-vfs /adhoc /toSSC 1115 / zzzAdmin/zzzAdmin_MFT1.0-vfs/fromSSC 1111 /zzzAdmin/zzzAdmin_MFT1.0-vfs/fromSSC/архив 1112 /zzzAdmin/zzzAdmin_MFT1.0-vfs/toSSC 1109