如何按缩进分割splitlines行并生成目标结构化列表?
解决方案:按缩进分组并合并文本
你已经成功定位到了那些作为段落起始的最小缩进行(行3、8、11),接下来只需要利用这些行号来划分段落范围,然后合并每个范围内的文本即可。下面是完整的实现步骤和代码:
步骤说明
- 先将原文本按行拆分,得到每行的内容列表;
- 结合你找到的关键行号(包括第一行),确定每个段落的行区间;
- 遍历每个区间,合并对应行的文本(去除缩进),最终组成目标列表。
完整代码实现
text = '''TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4''' # 1. 将文本按行拆分,保留每行内容 lines = text.splitlines() # 2. 你之前找到的最小缩进行号(注意这里行号是从1开始,列表索引从0开始,要减1) # 加上第一行,组成所有段落的起始索引 start_indices = [0, 2, 7, 10] # 对应原行号1、3、8、11 # 3. 确定每个段落的结束索引(下一个起始索引的前一位,最后一段到末尾) end_indices = [idx - 1 for idx in start_indices[1:]] + [len(lines)-1] # 4. 遍历每个段落区间,合并文本 result = [] for start, end in zip(start_indices, end_indices): # 提取当前段落的所有行,去除缩进后拼接 paragraph = ' '.join([line.lstrip() for line in lines[start:end+1]]) result.append(paragraph) print(result)
代码解释
- 行拆分:
splitlines()把原文本按换行符拆分成每行的列表,方便后续按行处理; - 索引转换:因为Python列表索引从0开始,所以把你找到的行号(1、3、8、11)转换成对应的索引0、2、7、10;
- 区间划分:通过起始索引生成结束索引,比如第一个段落从0到1(对应原行1-2),第二个从2到6(原行3-7),以此类推;
- 文本合并:对每个区间内的行,先去除左侧缩进(
lstrip()),再用空格拼接成完整的段落文本,最终存入结果列表。
运行这段代码后,你会得到期望的4个元素的列表:
[ 'TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1', 'TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2', 'TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3', 'TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4' ]
另外,如果你不想手动指定起始索引,也可以基于你之前的indent_dict自动推导:
# 基于indent_dict自动获取最小缩进的行号(转换为索引) min_indent = min(list_of_values) start_line_numbers = [k for k, v in indent_dict.items() if v == min_indent] # 加上第一行 start_line_numbers = [1] + start_line_numbers # 转换为列表索引 start_indices = [num-1 for num in start_line_numbers]
这样代码会更灵活,即使文本结构变化也能自动适配。
内容的提问来源于stack exchange,提问作者user12533975
相关产品推荐
相关产品推荐

