根据章节目录把文章拆分成字典
摘要
开展文本分析时,文章的章节目录是重要内容。在对不同文章比较时,章节标题往往是重要信息,用户通常有根据标题拿到对应文本内容的需求,比如有如下需求:
- 把一整篇文章,按照树形结构展开;
- 获得文章的目录;
实现基础
本文基于正则匹配实现,要求文章的有形如第一章 博主文笔真好、第一节 读者点赞
这样规范且固定的标题结构。
效果
如下图所示,展示了将一篇文章,根据目录结构拆分成字典的格式。字典的键是标题,值是内容。若是多级标题,则会以递归方式创造嵌套字典。
代码
import re
from pprint import pprint
data = open('data.txt').read()
level = '章节' # 请把文章的章节列在这里,比如篇章节
def cut(content, value):
data = re.findall(
f"(第[一二三四五六七八九十]+{value}.*)\n*([\s\S]*?)(?=第[一二三四五六七八九十]+{value}|\Z)",
content,
)
d = {}
idx = level.index(value)
for title, content in data:
d[title] = content.strip() if idx == len(level) - 1 else cut(content, level[idx + 1])
return d
res = cut(data, '章')
pprint(res)
在代码的同级目录下创建data.txt
文件
下面是data.txt
的文件内容:
标题 《彼岸之花》
第一章 迷雾重重
第一节 密林相遇
在茂密的雨林中,探险家李昂首次遇见了神秘女子艾莉娅。他们因为共同的目标——寻找传说中的神秘花朵“彼岸之花”而结伴同行。
第二节 险象环生的征程
李昂和艾莉娅在探险途中遭遇了种种险境,他们不仅要面对恶劣的自然环境,还要与危险的野生动物搏斗。两人在这段旅程中建立了深厚的友谊。
第三节 揭开迷雾
经过艰苦的跋涉,李昂和艾莉娅终于找到了神秘花朵“彼岸之花”所在的位置。然而,花朵却被一道无形的屏障守护着,让他们无法靠近。
第二章 命运的抉择
第一节 神秘力量的诱惑
李昂和艾莉娅在探索过程中发现,“彼岸之花”拥有改变命运的力量。艾莉娅想要利用这股力量改变自己的命运,而李昂则持怀疑态度。
第二节 分道扬镳
因为对力量的追求和信念的差异,李昂和艾莉娅产生了分歧。最终,艾莉娅独自去寻找“彼岸之花”,而李昂则决定返回文明世界。
第三节 重逢与释怀
李昂在离开前与艾莉娅重逢。他们经过一番交谈,终于放下了彼此间的误会与隔阂,重新建立了信任。他们意识到,真正的力量来自于内心的勇敢与善良。
第三章 勇往直前
第一节 挑战自我
为了获得“彼岸之花”,李昂和艾莉娅必须挑战自己的极限。他们不仅要克服内心的恐惧,还要面对未知的危险。在这个过程中,他们逐渐成长并变得更加坚强。
第二节 团结一致
在挑战过程中,李昂和艾莉娅逐渐认识到彼此的重要性。他们开始团结一致,互相扶持,共同面对困难。这种团队精神让他们逐渐接近目标。
第三节 绽放彼岸之花
经过艰苦的努力和无数次的尝试,李昂和艾莉娅终于成功地采摘到了“彼岸之花”。花朵绽放的瞬间,他们感受到了来自内心的喜悦和满足。这段旅程让他们明白了生命的真谛和勇敢追求梦想的重要性。
运行代码后便可得到如下输出结果:
程序结果生成的字典如下所示:
{'第一章 迷雾重重': {'第一节 密林相遇': '在茂密的雨林中,探险家李昂首次遇见了神秘女子艾莉娅。他们因为共同的目标——寻找传说中的神秘花朵“彼岸之花”而结伴同行。',
'第三节 揭开迷雾': '经过艰苦的跋涉,李昂和艾莉娅终于找到了神秘花朵“彼岸之花”所在的位置。然而,花朵却被一道无形的屏障守护着,让他们无法靠近。',
'第二节 险象环生的征程': '李昂和艾莉娅在探险途中遭遇了种种险境,他们不仅要面对恶劣的自然环境,还要与危险的野生动物搏斗。两人在这段旅程中建立了深厚的友谊。'},
'第三章 勇往直前': {'第一节 挑战自我': '为了获得“彼岸之花”,李昂和艾莉娅必须挑战自己的极限。他们不仅要克服内心的恐惧,还要面对未知的危险。在这个过程中,他们逐渐成长并变得更加坚强。',
'第三节 绽放彼岸之花': '经过艰苦的努力和无数次的尝试,李昂和艾莉娅终于成功地采摘到了“彼岸之花”。花朵绽放的瞬间,他们感受到了来自内心的喜悦和满足。这段旅程让他们明白了生命的真谛和勇敢追求梦想的重要性。',
'第二节 团结一致': '在挑战过程中,李昂和艾莉娅逐渐认识到彼此的重要性。他们开始团结一致,互相扶持,共同面对困难。这种团队精神让他们逐渐接近目标。'},
'第二章 命运的抉择': {'第一节 神秘力量的诱惑': '李昂和艾莉娅在探索过程中发现,“彼岸之花”拥有改变命运的力量。艾莉娅想要利用这股力量改变自己的命运,而李昂则持怀疑态度。',
'第三节 重逢与释怀': '李昂在离开前与艾莉娅重逢。他们经过一番交谈,终于放下了彼此间的误会与隔阂,重新建立了信任。他们意识到,真正的力量来自于内心的勇敢与善良。',
'第二节 分道扬镳': '因为对力量的追求和信念的差异,李昂和艾莉娅产生了分歧。最终,艾莉娅独自去寻找“彼岸之花”,而李昂则决定返回文明世界。'}}
扩展
若你的标题结构是其他格式的,本代码无法运行,。
若你的章节目录不同,你只需修改下述正则表达式:
f"(第[一二三四五六七八九十]+{value}.*)\n*([\s\S]*?)(?=第[一二三四五六七八九十]+{value}|\Z)"
比如你的章节目录是:
- 第1章 第1节
正则表达式修改成:
f"(第\d+{value}.*)\n*([\s\S]*?)(?=第\d+{value}|\Z)"
代码解读
核心代码
如下是一个只拆分章
的代码,希望这个小案例能够帮助你理解。
import re
from pprint import pprint
data = open('data.txt').read()
value = "章"
res = re.findall(
f"(第[一二三四五六七八九十]+{value}.*)\n*([\s\S]*?)(?=第[一二三四五六七八九十]+{value}|\Z)",
data,
)
d = {}
for title, content in res:
d[title] = content
pprint(d)
你也可以把value = “章”,换成value = "节"去体会这个区别
如下述结果所示,只从文章中拆分出章:
/usr/bin/python3 /Users/jshen/Documents/git/python/basic/string/examples/章节匹配/test.py
{'第一章 迷雾重重': '第一节 密林相遇\n'
'在茂密的雨林中,探险家李昂首次遇见了神秘女子艾莉娅。他们因为共同的目标——寻找传说中的神秘花朵“彼岸之花”而结伴同行。\n'
'第二节 险象环生的征程\n'
'李昂和艾莉娅在探险途中遭遇了种种险境,他们不仅要面对恶劣的自然环境,还要与危险的野生动物搏斗。两人在这段旅程中建立了深厚的友谊。\n'
'第三节 揭开迷雾\n'
'经过艰苦的跋涉,李昂和艾莉娅终于找到了神秘花朵“彼岸之花”所在的位置。然而,花朵却被一道无形的屏障守护着,让他们无法靠近。\n',
'第三章 勇往直前': '第一节 挑战自我\n'
'为了获得“彼岸之花”,李昂和艾莉娅必须挑战自己的极限。他们不仅要克服内心的恐惧,还要面对未知的危险。在这个过程中,他们逐渐成长并变得更加坚强。\n'
'第二节 团结一致\n'
'在挑战过程中,李昂和艾莉娅逐渐认识到彼此的重要性。他们开始团结一致,互相扶持,共同面对困难。这种团队精神让他们逐渐接近目标。\n'
'第三节 绽放彼岸之花\n'
'经过艰苦的努力和无数次的尝试,李昂和艾莉娅终于成功地采摘到了“彼岸之花”。花朵绽放的瞬间,他们感受到了来自内心的喜悦和满足。这段旅程让他们明白了生命的真谛和勇敢追求梦想的重要性。',
'第二章 命运的抉择': '第一节 神秘力量的诱惑\n'
'李昂和艾莉娅在探索过程中发现,“彼岸之花”拥有改变命运的力量。艾莉娅想要利用这股力量改变自己的命运,而李昂则持怀疑态度。\n'
'第二节 分道扬镳\n'
'因为对力量的追求和信念的差异,李昂和艾莉娅产生了分歧。最终,艾莉娅独自去寻找“彼岸之花”,而李昂则决定返回文明世界。\n'
'第三节 重逢与释怀\n'
'李昂在离开前与艾莉娅重逢。他们经过一番交谈,终于放下了彼此间的误会与隔阂,重新建立了信任。他们意识到,真正的力量来自于内心的勇敢与善良。\n'}
Process finished with exit code 0
递归拆分多级目录
cut是一个递归函数,它的返回值是{ 标题 : cut(内容) }
。对上一级递归生成的内容递归调用cut函数生成嵌套字典。
使用level = '章节'
,level 代表文章所有的章节结构名。
level = "章节"
idx = level.index(value)
...
idx == len(level) - 1 # 退出递归条件
当递归到达最后一级目录结构,达到递归出口无需继续调用cut函数。
希望上述针对递归粗浅的描述能帮助到你理解!