1

我有一个如图所示的文件。我想检索文件 ID、作者和描述。在某些 fileid 中,没有文件的描述。但是在一些fileid(即fileid=3)中,有一个文件的描述。我想知道如何在 Python 中获得描述。谢谢你。

start=re.compile('<file fileid=(\d+)\s*>')
end=re.compile('</file\s*>')

The Document starts from here:
--------------------------------------
<file fileid=11>
System File 765411
J.K
STAV December, 1959
</file>

<file fileid=12>
Batch File
James P.
STAV December, 1959
</file>

<file fileid=13>
Empty file
Person:Wolfe, P.
STAV December, 1959

This is a description of the empty file.
You need to put this file in the D:\location\systemB.
After putting the file to the location, the system will boot up.
Later, System B will refresh itself and show the output. 
</file>

<file fileid=14>
Nomal File
Mercy Lusia
STAV December, 1959
</file>
4

3 回答 3

1

一个非常简单的方法是读取文件的每一行,直到到达一行

<file fileid=xx>. 然后读取所有数据直到结束</file>标记

于 2013-11-07T23:29:01.363 回答
0

由于您已经编写了两个有效的正则表达式,让我们从那里开始。

您可以只是start.split(document),然后对于每个,end.split(the_one)[0]file节点的内容。

更简单地说,只需将 start 和 end regexps 与中间的 a 结合起来(.*?),现在您就有了一个查找文件节点并为您提供fileid值和内容的模式。只是rfile.find_all,或者find_iter,一旦你到达你关心的那个,你就可以停下来。

或者,更简单地说,只需使用仅搜索您关心的人的模式,将 替换(\d+)为硬编码数字(或{}您填写的.format)。

或者,更简单地说,完全删除正则表达式 - <code>start 是直到 的固定子字符串\s*>,所以只需使用普通子字符串搜索(如str.index)来找到它,然后对 next 进行子字符串搜索</file,以及最外面><是你的内容。

如果您想知道如何对整个文件运行正则表达式或普通子字符串搜索,如果文件足够小,则将整个文件read放入内存;如果它太大,mmap则将文件放入虚拟页面空间;如果它太大(除非您使用 32 位 Python,否则这不太可能……但您可能会这样做),您将不得不读取重叠缓冲区。

于 2013-11-07T23:47:56.843 回答
0

我也会匹配这些标签之间的内容;然后您可以按换行符拆分以接收部件和可选描述。

>>> files = re.findall('<file fileid=(\d+)\s*>\s*(.*?)</file\s*>', s, re.S)
>>> for fileid, file in files:
        title, author, date, description = file.split('\n', 3)
        print(title)
        print(author)
        print(date)
        print(description.strip())
        print('----')

System File 765411
J.K
STAV December, 1959

----
Batch File
Person: James P.
STAV December, 1959

----
Empty file
Person:Wolfe, P.
STAV December, 1959
This is a description of the empty file.
You need to put this file in the D:\location\systemB.
After putting the file to the location, the system will boot up.
Later, System B will refresh itself and show the output.
----

然后,您甚至可以创建文档字典:

documents = {}
for fileid, file in files:
    title, author, date, description = file.split('\n', 3)
    documents[fileid] = { 'title' : title, 'author' : author, 'date' : date }
    if description.strip():
         documents[fileid]['description'] = description.strip()
于 2013-11-07T23:33:21.620 回答