如何在Python中识别文本中的上标和/或下标

时间:2017-10-24 18:13:03

标签: python docx

我有一个文档,我必须在Python中提取与上标或下标相关联的字符串。我已经探索了docx库,我可以在其中添加上标和下标,但我想知道如何提取这样的字符串。我已经用Google搜索了,但找不到任何好的解决方案。

from docx import Document
document = Document()

p = document.add_paragraph('Normal text with ')

super_text = p.add_run('superscript text')
super_text.font.superscript = True

p.add_run(' and ')

sub_text = p.add_run('subscript text')
sub_text.font.subscript = True

document.save('test.docx')

1 个答案:

答案 0 :(得分:0)

您可以先尝试将docx文件转换为xml。然后使用正则表达式捕获上标和下标值。

这是一个例子

import re
import zipfile

try:
    from xml.etree.cElementTree import XML
except ImportError:
    from xml.etree.ElementTree import XML


def get_docx_xml(path):
    """Take the path of a docx file as argument, return the text in unicode."""
    document = zipfile.ZipFile(path)
    xml_content = document.read('word/document.xml')
    document.close()
    return xml_content


def get_superscript_subscript(xml_content):
    """Returns a dictionary with a value of list of superscipt and subscript."""
    superscript = re.findall('<w:vertAlign w:val="superscript"\/><w:lang w:val="[\S\s]*?"\/><\/w:rPr><w:t>([\S]+)<\/w:t><\/w:r>[\s\S]*?<w:t xml:space="preserve">([\s]*[\S]*)[\s\S]*?<\/w:t><\/w:r>', xml_content)
    subscript = re.findall('<w:vertAlign w:val="subscript"\/><w:lang w:val="[\S\s]*?"\/><\/w:rPr><w:t>([\S]+)<\/w:t><\/w:r>[\s\S]*?<w:t xml:space="preserve">([\s]*[\S]*)[\s\S]*?<\/w:t><\/w:r>', xml_content)
    return {"superscript": superscript, "subscript": subscript}

if __name__ == '__main__':
    xml_content = get_docx_xml(<docx_file_path>)
    superscripts_subscripts = get_superscript_subscript(xml_content)

输出将是这样的 - 具有元组项列表值的字典: 第一个是上标/下标,第二个是后面的第一个单词。

{'下标':[('28',')'),('28','得分'),('28','是'),('28','sum'),( '28','和'),('28','得分'),('28',')')], '上标':[('28',')'),('28','得分'),('28','是'),('28','sum'),('28', '和'),('28','得分'),('28',')')]}