You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python按特定模式拆分目录文本:无法识别章节号的技术求助

搞定目录章节号提取,轻松转成DataFrame

嘿,我太懂这种头疼了——自己攒了一堆检查逻辑能把章节名和页码抓到DataFrame里,可章节号就是死活识别不出来,还对正则犯怵?别慌,我给你整个上手简单的方案,不用你死磕正则细节!

核心思路:用正则精准匹配目录行的结构

目录行的格式一般逃不过「章节号 + 章节名 + 页码」的模式,不管是1 第一章 51.1 小节标题 12还是II. 第二章 20这类,我们都可以用一个灵活的正则表达式把三个部分分别抓出来。

直接能用的代码示例

假设你的目录文本是按行存储的(比如从PDF提取的目录内容,每行对应一条目录项),可以这么搞:

import pandas as pd
import re

# 示例目录文本(你可以换成自己的实际内容)
toc_text = """
1 第一章 5
1.1 第一节 8
1.2 第二节 15
2 第二章 22
2.1.1 细分小节 28
III 第三章 35
"""

# 定义正则匹配模式:适配常见的章节号格式(数字多级/罗马数字)
# 解释下每个部分:
# ^:匹配行开头
# ([\d.]+|[\dIVXLCDM]+):匹配章节号,支持数字加小数点(1.1.1)或罗马数字(III)
# \s+:匹配章节号和章节名之间的空格
# (.*?):非贪婪匹配章节名(避免把页码前的空格也算进去)
# \s+:匹配章节名和页码之间的空格
# (\d+):匹配页码(纯数字)
# $:匹配行结尾
pattern = r'^([\d.]+|[\dIVXLCDM]+)\s+(.*?)\s+(\d+)$'

# 遍历每一行提取数据
toc_data = []
for line in toc_text.strip().split('\n'):
    match = re.match(pattern, line.strip())
    if match:
        chapter_num = match.group(1)
        chapter_name = match.group(2)
        page_num = int(match.group(3))
        toc_data.append({'章节号': chapter_num, '章节名': chapter_name, '页码': page_num})

# 转成DataFrame
df = pd.DataFrame(toc_data)
print(df)

运行这段代码后,你就能得到包含章节号、章节名、页码三列的DataFrame了!

按需调整正则

如果你的目录有特殊格式(比如章节号带括号(1)、或者章节名和页码之间是虚线---),只需要微调正则里的对应部分就行:

  • 比如章节号是(1.1):把正则里的([\d.]+|[\dIVXLCDM]+)改成\(([\d.]+)\)
  • 比如章节名和页码之间是虚线:把\s+(\d+)$改成\s+[-—]+\s+(\d+)$-是普通短横线,是长横线)

为啥这个方法比你之前的拼凑逻辑靠谱?

正则是专门处理这种结构化文本匹配的工具,一次就能把三个字段都抓出来,不用你写一堆if-else去判断字符位置,维护起来也简单多了~

内容的提问来源于stack exchange,提问作者user2679611

火山引擎 最新活动