问题描述
我正在使用python-docx库从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}+)+")
python regex(re)不向后兼容。因此,尤其是在您的文本是多语言的情况下,请使用[regex] [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}+)+",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))
注意:粗体字或斜体字并不总是在运行级别出现。如果未获取这些参数,则应签入样式和参数级别。