You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Word文档中检测正则匹配词汇并定位其出现页码

解决方案

问题根因

你当前使用的docx2txt库仅会将Word文档所有区域的内容合并为单一纯文本字符串,完全丢失了位置、页码、所属区域等元信息,因此无法将匹配结果和页码关联。

方案1:Windows平台原生调用(推荐,100%覆盖页眉/正文/脚注)

直接调用Word官方COM接口获取内容对应页码,匹配结果和Word实际展示的页码完全一致。

依赖安装

pip install pywin32

实现代码

import re
import win32com.client as win32
from win32com.client import constants

# 你的正则规则保持不变
pattern = re.compile(r'\bDOC[-–—]\d{9}(?!\d)')
doc_path = r"Word_Document.docx"
result_list = []

# 启动Word应用
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False  # 后台运行,不显示界面
try:
    # 打开文档
    doc = word.Documents.Open(doc_path)
    # 遍历所有内容区域:包含正文、页眉、页脚、脚注、尾注等所有区域
    for story in doc.StoryRanges:
        current_range = story
        while current_range is not None:
            text = current_range.Text
            # 正则匹配当前区域内容
            for match in pattern.finditer(text):
                # 定位到匹配内容的范围,获取页码
                match_range = current_range.GoTo(What=constants.wdGoToCharacter, Count=match.start() + 1)
                page_num = match_range.Information(constants.wdActiveEndPageNumber)
                result_list.append((match.group(), page_num))
            # 处理同类型的后续区域(比如多节的页眉)
            current_range = current_range.NextStoryRange
    doc.Close(SaveChanges=False)
finally:
    # 关闭Word进程,避免后台残留
    word.Quit()

# 输出最终结果,格式和你要求的完全一致
print(result_list)

方案2:跨平台方案(兼容Mac/Linux)

如果非Windows系统,可先将Word转PDF,再通过PDF解析库获取匹配内容的页码。

依赖安装

pip install pymupdf
# 需提前安装LibreOffice用于Word转PDF,Mac/Linux均可通过对应包管理器安装

实现代码

import re
import fitz  # PyMuPDF
import subprocess
import os

pattern = re.compile(r'\bDOC[-–—]\d{9}(?!\d)')
doc_path = "Word_Document.docx"
pdf_path = "temp_word.pdf"
result_list = []

try:
    # 调用LibreOffice将Word转PDF
    subprocess.run(
        ["libreoffice", "--headless", "--convert-to", "pdf", "--outdir", os.path.dirname(pdf_path), doc_path],
        check=True
    )
    # 打开PDF逐页匹配
    with fitz.open(pdf_path) as pdf_doc:
        for page_idx in range(pdf_doc.page_count):
            page = pdf_doc.load_page(page_idx)
            page_text = page.get_text()
            for match in pattern.finditer(page_text):
                # PDF页码从0开始计数,+1对应Word实际页码
                result_list.append((match.group(), page_idx + 1))
finally:
    # 删除临时PDF文件
    if os.path.exists(pdf_path):
        os.remove(pdf_path)

print(result_list)

注意事项

  • 方案1的页码和Word显示完全一致,支持任意复杂格式的多节、不同页码规则的文档
  • 方案2的转换环节如果Word有复杂排版,可能出现极小概率的页码偏移,适合对精度要求不是极端严格的跨平台场景

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:27:02