如何用正则提取葡萄牙诉讼文档的章节标题及对应内容?
葡萄牙语诉讼文档章节提取解决方案
问题分析
你用的正则^[A-Z\s\d\W]+$范围太宽泛,仅靠全大写行匹配标题,但葡萄牙语诉讼文档里可能存在全大写的正文段落(比如PDF转换时的格式错乱、强调性正文内容),导致误匹配。另外,葡萄牙语带重音的大写字母(À, Á, Â, É, Ê, Í, Ó, Ô, Ú, Ç等)未被原正则覆盖,会直接漏掉带重音的合法标题。
优化正则方案
1. 精准匹配标题特征
葡萄牙语诉讼文档的章节标题通常具备以下特征:
- 全大写(含带重音的大写字母及Ç)
- 带有明确的章节前缀(如CAPÍTULO、SEÇÃO、ARTIGO等)或数字编号(如1., 1.1, 3.2.1等)
- 单独占一行,结尾可能带标点(冒号、句号等)
优化后的正则表达式:
^(CAPÍTULO|SEÇÃO|ARTIGO|PARÁGRAFO|ITEM|[\d.]+)\s+[A-ZÀ-ÚÇ\s\W]+$
- 优先匹配常见的章节前缀或数字编号,锁定标题的核心标识
- 覆盖葡萄牙语所有带重音的大写字母,避免遗漏合法标题
2. 结合上下文过滤误匹配
如果仍存在少量误匹配,可以通过上下文逻辑进一步过滤:
- 标题下一行通常是正文(首字母小写或存在缩进)
- 标题长度不会过长(超过50字符的全大写行大概率是正文)
示例Python代码实现:
import re def extract_chapters(doc_content): # 匹配标题的正则规则 title_pattern = re.compile(r"^(CAPÍTULO|SEÇÃO|ARTIGO|PARÁGRAFO|ITEM|[\d.]+)\s+[A-ZÀ-ÚÇ\s\W]+$", re.MULTILINE) chapters = [] lines = doc_content.split("\n") current_title = None current_content = [] for line in lines: line = line.strip() if not line: continue # 检查当前行是否为标题 if title_pattern.match(line): # 保存上一个章节的内容 if current_title: chapters.append((current_title, "\n".join(current_content))) current_content = [] current_title = line else: # 非标题行,归入当前章节内容 if current_title: current_content.append(line) # 保存最后一个章节 if current_title and current_content: chapters.append((current_title, "\n".join(current_content))) return chapters # 调用示例 with open("processo_judicial.txt", "r", encoding="utf-8") as f: content = f.read() extracted_result = extract_chapters(content) for title, content in extracted_result: print(f"=== {title} ===") print(content[:200] + "...\n")
额外优化建议
- 使用
pdftotext的-layout参数执行转换:pdftotext -layout input.pdf output.txt,保留PDF原格式布局,减少行错乱导致的匹配误差 - 对于格式复杂的文档,可结合PDF解析库(如pdfplumber、PyPDF2)直接获取文本的字体大小、加粗样式,标题通常具备更大字号或加粗属性,能实现更精准的区分
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

