如何以"Title"为分隔符拆分列表生成嵌套子列表?
解决列表按"Title"开头元素拆分的问题
嗨,我来帮你搞定这个问题~首先得指出你之前思路的小问题:re.findall是用来处理字符串的,但你直接传入了列表l,这本身就不符合正则函数的使用场景。而且就算把列表转成字符串,你写的正则也会漏掉最后一组——因为它匹配的是Title开头到下一个Title的内容,最后一组后面没有Title,自然就匹配不到啦。
下面给你两种靠谱的实现方法,优先推荐第一种,简单直观还好理解:
方法一:遍历列表手动分组(最推荐)
这个方法直接操作列表元素,逻辑清晰,不容易踩坑:
l = ["Title abc", "text1", "text", "Title def", "text4", "text5", "Title ghi", "text4", "text5"] new = [] current_sublist = [] for item in l: # 遇到以"Title"开头的元素,就开启新的子列表 if item.startswith("Title"): # 如果当前已有未完成的子列表,先把它加入结果 if current_sublist: new.append(current_sublist) # 初始化新的子列表,加入当前Title项 current_sublist = [item] else: # 非Title项,直接加入当前子列表 current_sublist.append(item) # 循环结束后,别忘了把最后一个子列表加入结果 if current_sublist: new.append(current_sublist) print(new)
运行后就能得到你想要的输出:
[["Title abc", "text1", "text"], ["Title def", "text4", "text5"], ["Title ghi", "text4", "text5"]]
方法二:用正则处理(适合熟悉正则的场景)
如果你一定要用正则,得先把列表转成字符串,再匹配后拆分,注意要处理最后一组没有后续Title的情况:
import re l = ["Title abc", "text1", "text", "Title def", "text4", "text5", "Title ghi", "text4", "text5"] # 把列表转成用换行分隔的字符串(假设元素里没有换行符) list_str = "\n".join(l) # 正则匹配:匹配从Title开始,到下一个Title或者字符串结尾的内容 matches = re.findall(r"(Title.*?)(?=Title|$)", list_str, re.DOTALL) # 把每个匹配到的字符串拆分成列表 new = [match.split("\n") for match in matches]
不过这个方法有个局限性:如果你的列表元素里本身包含换行符,拆分的时候会出错,所以还是第一种方法更通用哦。
内容的提问来源于stack exchange,提问作者Woods
相关产品推荐
相关产品推荐

