我有一个目录列表,我想创建一个缩进的字符串
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
我做错了什么?
答案 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