我有一个文档,我必须在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')
答案 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',')')]}