(python)R和.text格式有些麻烦

时间:2013-11-23 01:56:06

标签: python regex string

这里有一个菜鸟。手头的任务是解析某些字符串的.txt文件。我正在使用RE来帮助解决这个问题,但是这条线路无效:

s = 'Qty'
for line in txtdoc:
    if s in line:
        quantity = re.search(':[1-9]', line)
        print(quantity.group())

要解析的文本(来自我的txtdoc文件中的一行):

stringstringQty:1stringstring

我是否正确,我应该看到':1'打印出来?相反,它会产生错误,因为“数量”变量为空。我也尝试使用re.findall,它只打印了一个空集“[]”。

现在,我认为这可能与.txt文件的格式有关,因为名义上我需要的数据是在MS Word中。我有一个脚本将Word文档保存为.txt然后我尝试解析它。

当我选择我要解析的行并将其复制/粘贴到Outlook或MS Word时,它会自动格式化:

string
string
Qty:
1
string
string

所以看到之后,我试过了

re.search(r':/n[1:9]', line)

但这也不起作用。有任何想法吗?我提供了更多的代码,但是我在工作中正在研究这个问题,并且自从我回到家以来一直在考虑这个问题,所以我不得不放弃记忆。

1 个答案:

答案 0 :(得分:0)

问题是你有Word .doc文件,而不是文本文件。

Word文件本质上是一系列格式化文本的运行。 (它实际上比这更复杂,它是各种事物的树,其中一些是文本的运行,但是让我们现在保持简单。)

在“经典”Word格式中,每次运行都是一串字节。在现代(DOCX,又称Office 2007,又名Office Open XML,又名WordML)Word格式中,它们中的每一个都是树中的XML节点。但无论如何,如果您有一个以:结尾的运行而另一个以1结尾的运行,则您将无法在文件中找到:1;你会发现:后跟一堆残骸(一个二进制对象的结尾和下一个的开始,或者一个XML节点的结束和下一个的开始,可能还有其他对象/节点)之间),然后是1

如果不实际解析Word格式,就没有好办法解决这个问题。

所以,最大的问题是,你有哪种格式?


如果它是DOCX,那基本上只是一个XML文件,或者里面有XML文件的ZIP文件,您可以在Python中本地解析 - 或者更好的是,使用像docx那样完成所有操作的模块努力工作。

如果它是经典DOC,解析它的唯一方法是阅读人们多年来编写的反向工程文档,并编写一些讨厌的代码来处理它。或者,当然,您可以使用某人已编写的代码。在这种情况下,我不知道任何有用的python模块,但您可以通过subprocess轻松控制antiword程序。


或者,或者,如果您的程序可以读取计算机上的文件,例如Windows上的Word或Wordpad / Write,Mac上的iWork Pages或任何平台上的OpenOffice.org/Libre Office,您可以编写脚本那。 Python有很好的包装器可以与Windows上的COM接口和Mac上的AppleScript接口进行通信,并且OO.o / Libre可以编写脚本。

This blog post是一个很好的例子,可以通过pywin32在Windows上使用Word来处理doc文件。您可以将此作为您自己的代码的起点,从每个文件中提取文本,或者使Word搜索到您,或者只保存每个文件的纯文本副本,然后您可以随意执行任何操作。整个网络上还有数百个其他此类示例,以及使用appscriptScriptingBridge在Mac上执行等效操作,或使用VBA而不是Python从Word内部编写脚本的类似示例,要查找脚本Word时可用的功能,如果您没有2013,请参阅Word 2013 developer reference或早期版本的类似文档,或者只在AppleScript编辑器中查看“打开字典”并查看Word的字典如果你有一台Mac。