如何使用pythondocx从文档中提取标题号?

如何使用pythondocx从文档中提取标题号?,python,parsing,ms-word,python-docx,Python,Parsing,Ms Word,Python Docx,我使用PythonDocx库从docx文档中提取数据,但是我还需要标题号/段落号。我想建立一个校对工具,我需要知道这些信息,但是我在文本中找不到这些信息,也找不到段落的风格。有没有办法提取这些信息? 我可以循环浏览相同标题号的标签,但是如果用户在编写文档时没有使用正确的标题标签呢? 或者,如果他们选择不使用默认的单词约定1,1.1,1.1.1,a,而是选择使用自己的东西,那又该怎么办 基本上我想要一种提取这些数字的方法,2,2.1,2.2.1,(a)。我怎么做呢?我试过一个类似的方法,但适用于

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


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

我试过一个类似的方法,但适用于多语言

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

  • 粗体文本
  • 字体、大小
  • 标题以int(2)开头,副标题以float(2.1)开头
  • 文本前和数字后的分隔符('\t'或'space')是什么
  • 观察这些情况并尝试构建模式。通过使用正则表达式,我们可以提取所需的

    这是正则表达式,可以满足您的要求。即使是多语言的

    headings = regex.search("\d+\.\t(\p{Lu}+([\s]+)?)+")
    subHeadings =regex.search("\d+\.\d+\t\p{Lu}(\p{Ll}+)+")
    
    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))
    
    python正则表达式(re)不向后兼容。所以使用这个[regex][1],特别是当你的文本是多语言的时候

    headings = regex.search("\d+\.\t(\p{Lu}+([\s]+)?)+")
    subHeadings =regex.search("\d+\.\d+\t\p{Lu}(\p{Ll}+)+")
    
    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))
    
    导入正则表达式
    从docx导入文档
    单据=单据(“”)
    #反复阅读段落(在一个词中,一切都是段落)
    甚至连空白行都是段落
    对于索引,枚举中的段落(文件段落):
    跳过空白段落
    如果(第段):
    headers=regex.search(“\d+\。\t(\p{Lu}+([\s]+)?)+”,段落文本,regex.UNICODE)
    subHeadings=regex.search(“\d+\.\d+\t\p{Lu}(\p{Ll}+”),para.text,regex.UNICODE)
    如果标题:
    如果第1.2段运行:
    对于磨合段运行:
    #在运行级别检查粗体或斜体。
    如果为run.bold:
    打印(“粗体标题:”,标题组(0))
    如果为run.italic:
    打印(“斜体标题:”,标题组(0))
    如副标题为:
    如果第1.2段运行:
    对于磨合段运行:
    #在运行级别检查粗体或斜体。
    如果为run.bold:
    打印(“粗体子目:”,子目。第(0)组)
    如果为run.italic:
    打印(“斜体子目:”,子目。第(0)组)
    
    注意:粗体或斜体在运行级别并不总是存在。如果没有获得这些参数,则应检入样式和段落级别