提问者:小点点

如何使用python-docx从文档中提取标题编号?


我正在使用python-docx库从docx文档中提取数据,但是我也想要标题号/段落号。我想构建一个校对工具,我需要知道这些信息,但是我既无法在文本中找到这些信息,也无法找到段落的风格。有没有办法提取这些信息?我可以循环浏览相同标题编号的标签,但是如果用户在编写文档时没有使用正确的标题标签怎么办?或者,如果他们选择不使用默认单词约定 1、1.1、1.1.1、a 并选择使用而是自己的东西?

基本上我想要一种方法来提取这些数字,2,2.1,2.2.1,(a)。我该怎么做?


共1个答案

匿名用户

我尝试了类似的方法,但用于多语言。

首先,您必须观察标题(1,2,3...)和副标题(2.1,2.2...),并尝试提取一些常见的东西。它们可能具有以下一些独特的模式:

  1. 粗体文本
  2. 字体、大小
  3. 标题以 int(2) 开头,副标题以浮点数 (2.1) 开头
  4. 文本之前和数字之后的分隔符(“\t”或“空格”)是什么

观察这些事情并尝试构建模式。通过使用正则表达式,我们可以提取所需的。

这是正则表达式,它将满足您的情况。即使是多语言。

headings = regex.search("\d+\.\t(\p{Lu}+([\s]+)?)+")
subHeadings =regex.search("\d+\.\d+\t\p{Lu}(\p{Ll}+)+")

python正则表达式(re)不向后兼容。所以使用这个[正则表达式][1],特别是如果你的文本是多语言的。

import regex
from docx import Document
doc = Document("<<Your doc file name here>>")

# Iterate through paragraphs ( in a word everything is a paragraph)
# Even the blank lines are paragraphs
for index, para in enumerate(doc.paragraphs):

# Skipping the blank paragraphs
    if(para.text):
        headings = regex.search("\d+\.\t(\p{Lu}+([\s]+)?)+",para.text,regex.UNICODE)
        subHeadings = regex.search("\d+\.\d+\t\p{Lu}(\p{Ll}+)+",para.text,regex.UNICODE)
        if headings:
            if para.runs:
                for run in para.runs:
                    # At run level checking for bold or italic.
                    if run.bold:
                        print("Bold Heading :",headings.group(0))
                    if run.italic:
                        print("Italic Heading :",headings.group(0))
          if subHeadings :
            if para.runs:
                for run in para.runs:
                    # At run level checking for bold or italic.
                    if run.bold:
                        print("Bold subHeadings :",subHeadings .group(0))
                    if run.italic:
                        print("Italic subHeadings :",subHeadings .group(0))

注意:粗体或斜体在运行级别并不总是存在。如果您没有获得这些参数,则应检查样式和段落级别。