Python按特定模式拆分目录文本:无法识别章节号的技术求助
搞定目录章节号提取,轻松转成DataFrame
嘿,我太懂这种头疼了——自己攒了一堆检查逻辑能把章节名和页码抓到DataFrame里,可章节号就是死活识别不出来,还对正则犯怵?别慌,我给你整个上手简单的方案,不用你死磕正则细节!
核心思路:用正则精准匹配目录行的结构
目录行的格式一般逃不过「章节号 + 章节名 + 页码」的模式,不管是1 第一章 5、1.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




