【问题标题】:OpenOffice odt document, regex, and arraysOpenOffice odt 文档、正则表达式和数组
【发布时间】:2022-01-07 20:22:59
【问题描述】:

我正在尝试使用约 300 页的 odt 文档。我知道如何在 python 中加载文档,至少以基本方式。这对 odt 不起作用(它不是 txt 文件)。我对此进行了研究并安装了 odfpy 库,尽管它似乎没有很好的文档记录。我能够让它达到我拥有它的数组的程度。但我不知道如何尝试在多个数组条目中使用正则表达式。于是我试着用“str()”把它转换成一个字符串,得到的只是一长串地址。

我希望能够加载 odt 文档并运行正则表达式以从中删除特定模式。我该怎么做...?到目前为止,我一直在尝试的方法不起作用。我想保持 odt 的结构完好无损。我比较习惯txt。

import sys
import re
from odf.opendocument import load
from odf import text, teletype
infile = load(r'C:\Users\Iainc\Documents\Blah Blah.odt')
allparas = infile.getElementsByType(text.P)
stringallparas = str(allparas)

到目前为止,我相信这是成功的。但是某些适用于 .txt 的东西不起作用。

【问题讨论】:

    标签: python arrays regex odt odfpy


    【解决方案1】:

    以下内容可能会起作用。将“Your pattern here”替换为要替换的正则表达式模式。

    import sys
    import re
    from odf.opendocument import load
    from odf import text, teletype
    infile = load(r'C:\Users\Iainc\Documents\Blah Blah.odt')
    for item in infile.getElementsByType(text.P):
        s = teletype.extractText(item)
        m = re.sub(r'Your pattern here', '', s)
        if m != s:
            new_item = text.P()
            new_item.setAttribute('stylename', item.getAttribute('stylename'))
            new_item.addText(m)
            item.parentNode.insertBefore(new_item, item)
            item.parentNode.removeChild(item)
    
    infile.save('result.odt')
    

    此代码中的 for 循环取自 odfpy wiki 上的 ReplaceOneTextToAnother,并稍作修改以使用 re.sub 而不是 str.replacetext.P 而不是 text.Span

    【讨论】:

    • 当我这样做时,它会返回一个错误。 ... infile.save(r'C:\Users\Iainc\Documents\The Seventh Story 2.odt') 文件“”,第 10 行 infile.save(r'C:\Users\Iainc\Documents\第七故事2.odt') ^^^^^^ SyntaxError: invalid syntax 为什么会这样?
    • 我在 save 调用之前添加了一个空行来修复 SyntaxError,因此代码现在应该可以工作了。我认为这个错误的发生是因为 Python 的 repl (read-eval-print-loop) 需要一个缩进的行。添加一个空行告诉 Python 当前缩进的块已经结束。请参阅以下链接,了解为什么需要空白行。 Why am I getting an invalid syntax error in Python REPL right after IF statement?
    • 是的,现在它确实运行了……但是,我的正则表达式捕获了几乎所有的“[(”和“)]”,将它从大约 4600 减少到大约 90……因为有一个“)]”,然后是一个换行符,然后在它的正下方,一个“[(”......如果将它从“。”更改为“[\s\S]”,那将解决这个问题......? ...不,它根本没有减少它,超出原始版本...为什么?这不是假设要拿掉剩下的吗?
    • 对上述问题的补充:文档中有3603例“[(”,但只有3601例“)]”。这意味着,两次,大概,我忘了用“)]”关闭“[(”)。这是否会对代码造成严重破坏,并导致它删除不应该删除的内容?
    • 您可以使用re.DOTALL 标志使. 匹配换行符。类似re.sub(r'Your pattern here', '', s, 0, re.DOTALL)。零计数替换所有出现。您可能需要检查文档并确保所有大括号都匹配。如果大括号不匹配,代码可能会删除不应该删除的内容,因此您可能应该在运行代码之前备份文档。
    猜你喜欢
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多