Python从列表中创建缩进字符串

时间:2016-08-28 17:03:17

标签: python

我有一个目录列表,我想创建一个缩进的字符串

list = ['1. Section', '1.1 Subsection', '1.1.1 Subsubsection', '1.1.2 Subsubsection', '2. Section', '2.1 Subsection', '2.1.1 Subsubsection', '2.1.2 Subsubsection', '2.2 Subsection', '2.2.1 Subsubsection']

期望的结果是:

1. Section
    1.1 Subsection
        1.1.1 Subsubsection
        1.1.2 Subsubsection
2. Section
    2.1 Subsection
        2.1.1 Subsubsection
        2.1.2 Subsubsection
    2.2 Subsection
        2.2.1 Subsubsection

我试过这个:

toc = ''

for tocitem in list:
    if re.match('(\d+)\.', tocitem):
        toc += tocitem + '\n'
    elif re.match('(\d+)\.(\d+)', tocitem):
        toc += '\t' + tocitem + '\n'
    else:
        toc += '\t\t' + tocitem + '\n'

但标签无法识别,就是我得到了这个

1. Section
1.1 Subsection
1.1.1 Subsubsection
1.1.2 Subsubsection
2. Section
2.1 Subsection
2.1.1 Subsubsection
2.1.2 Subsubsection
2.2 Subsection
2.2.1 Subsubsection

我做错了什么?

6 个答案:

答案 0 :(得分:1)

颠倒if re.match(...)语句的顺序。所有项目都通过了第一次测试,因此代码永远不会进入elif块。

答案 1 :(得分:1)

试试这个:

toc = ''
for tocitem in list:
    if re.match('(\d+)\.(\d+)\.', tocitem):
        toc +=  '\t\t' + tocitem + '\n'
    elif re.match('(\d+)\.(\d+)', tocitem):
        toc += '\t' + tocitem + '\n'
    else:
        toc +=tocitem + '\n'

答案 2 :(得分:1)

首先,我使用lst代替list,因为list是一个函数......

接下来,要使其工作,您需要先匹配最长的
一系列数字,然后工作到最短的数字。

toc = ''

for tocitem in lst:
    if re.match('(\d+)\.(\d+)\.(\d+)', tocitem):
        toc += '\t\t' + tocitem + '\n'
    elif re.match('(\d+)\.(\d+)', tocitem):
        toc += '\t' + tocitem + '\n'
    else:
        toc += tocitem + '\n'

还有输出:


1. Section
        1.1 Subsection
                1.1.1 Subsubsection
                1.1.2 Subsubsection
2. Section
        2.1 Subsection
                2.1.1 Subsubsection
                2.1.2 Subsubsection
        2.2 Subsection
                2.2.1 Subsubsection

现在,这是关于你的问题 但是,如果没有if s,我会更系统地执行此操作 如下:

toc = ''

for tocitem in lst:
    s = re.match(r'\S+', tocitem).group(0)
    digits = [x for x in s.split('.') if x.strip() != '']
    toc += (len(digits) - 1) * 4 * ' ' + tocitem + '\n'

正则表达式只是找到直到空格的第一部分,
然后在点上拆分并取出所有非空白的物品。

答案 3 :(得分:1)

第一个if条件也匹配其他情况。因此,您必须切换订单,或采用更一般的方法:

toc = ''
for tocitem in list:
    number = tocitem.split()[0]
    toc += '\t' * number.strip('.').count('.') + tocitem + '\n'

答案 4 :(得分:1)

非常有趣的问题!这是一个可能的解决方案,假设您的数据没有排序。

python 2.x

import re
import random

# Unordered data!!!
lst = ['1. Section', '1.1 Subsection', '1.1.1 Subsubsection', '1.1.2 Subsubsection', '2. Section',
       '2.1 Subsection', '2.1.1 Subsubsection', '2.1.2 Subsubsection', '2.2 Subsection', '2.2.1 Subsubsection']
random.seed(1)
random.shuffle(lst)

# Creating TOC
data = {v[:v.rindex(" ")]: v for v in lst}
keys = sorted(data.keys(), key=lambda x: map(
    int, filter(lambda x: x, x.split('.'))))

toc = ''
for k in keys:
    number = data[k].split()[0]
    toc += '\t' * number.strip('.').count('.') + k + '\n'

print toc

答案 5 :(得分:1)

给出带有节标题的排序列表:

li = ['1. Section', '1.1 Subsection', '1.1.1 Subsubsection', '1.1.2 Subsubsection', '2. Section', '2.1 Subsection', '2.1.1 Subsubsection', '2.1.2 Subsubsection', '2.2 Subsection', '2.2.1 Subsubsection']

你可以这样做:

print '\n'.join(['\t'*(len(re.findall(r"(\d+)", s))-1)+s for s in li])

打印:

1. Section
    1.1 Subsection
        1.1.1 Subsubsection
        1.1.2 Subsubsection
2. Section
    2.1 Subsection
        2.1.1 Subsubsection
        2.1.2 Subsubsection
    2.2 Subsection
        2.2.1 Subsubsection

给出您要先排序的随机顺序列表:

li=['2.1.2 Subsubsection', '2.1.1 Subsubsection', '1.1.1 Subsubsection', '1. Section', '2. Section', '1.1 Subsection', '2.2 Subsection', '2.2.1 Subsubsection', '2.1 Subsection', '1.1.2 Subsubsection']

您可以在没有正则表达式的情况下在一个循环中进行排序和缩进:

for n, s in sorted([(ni, si) for ni, _, si in [x.partition(' ') for x in li]]):
    print '\t'*(len([e for e in n.split('.') if e])-1)+n, s

打印:

1. Section
    1.1 Subsection
        1.1.1 Subsubsection
        1.1.2 Subsubsection
2. Section
    2.1 Subsection
        2.1.1 Subsubsection
        2.1.2 Subsubsection
    2.2 Subsection
        2.2.1 Subsubsection