正则表达式根据文章的目录结构把整篇文章剖析成字典格式

根据章节目录把文章拆分成字典

摘要

 开展文本分析时,文章的章节目录是重要内容。在对不同文章比较时,章节标题往往是重要信息,用户通常有根据标题拿到对应文本内容的需求,比如有如下需求:

  • 把一整篇文章,按照树形结构展开;
  • 获得文章的目录;

实现基础

 本文基于正则匹配实现,要求文章的有形如第一章 博主文笔真好、第一节 读者点赞
这样规范且固定的标题结构。

效果

如下图所示,展示了将一篇文章,根据目录结构拆分成字典的格式。字典的键是标题,值是内容。若是多级标题,则会以递归方式创造嵌套字典。
在这里插入图片描述

代码

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函数。

希望上述针对递归粗浅的描述能帮助到你理解!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieshenai

为了遇见更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值