Python String解析

时间:2009-12-08 21:41:32

标签: python

我正在开发一个数据包检索系统,该系统将根据标签系统[类似于HTML标签]获取数据包,并处理数据包的各种部分。 [仅基于文本的文件,没有二进制文件]。

数据包的每个部分都包含在两个相同的标记之间,这是一个示例数据包:

"<PACKET><HEAD><ID><ID><SEQ><SEQ><FILENAME><FILENAME><HEAD><DATA><DATA><PACKET>"

整个数据包都包含在<PACKET><PACKET>标记中。 所有元数据都包含在<HEAD><HEAD>标记中,数据包所属的文件名包含在<FILENAME><FILENAME>标记中。

让我们假设,例如,接收单个数据包并将其存储在名为sTemp的临时字符串变量中。 例如,如何有效地检索一对标签的内容,例如<FILENAME><FILENAME>标签的内容?

我希望有这样的功能,比如说getTagFILENAME(packetX),它会返回数据包的<FILENAME><FILENAME>标签的文本字符串内容。 这可能是使用Python吗?

任何建议或意见表示赞赏。

3 个答案:

答案 0 :(得分:1)

这样的东西?

import re
def getPacketContent ( code, packetName ):
    match = re.search( '<' + packetName + '>(.*?)<' + packetName + '>', code )
    return match.group( 1 ) if match else ''

# usage
code = "<PACKET><HEAD><ID><ID><SEQ><SEQ><FILENAME><FILENAME><HEAD><DATA><DATA><PACKET>"
print( getPacketContent( code, 'HEAD' ) )
print( getPacketContent( code, 'SEQ' ) )

答案 1 :(得分:1)

如果数据包格式有效地使用看起来像XML的语法(即,如果“结束标记”实际上包含斜杠),则可以使用xml.etree.ElementTree。 这个libray是Python标准库的一部分,从Py2.5开始。我觉得处理这类数据非常方便。它提供了许多方法来读取和修改这种树结构。由于XML语言的通用特性以及ElementTree库中内置的XML感知,数据包语法可以很容易地发展,例如支持重复元素,元素属性。

示例:

>>> import xml.etree.ElementTree
>>> myPacket = '<PACKET><HEAD><ID>123</ID><SEQ>1</SEQ><FILENAME>Test99.txt</FILE
NAME></HEAD><DATA>spam and cheese</DATA></PACKET>'
>>> xt = xml.etree.ElementTree.fromstring(myPacket)
>>> wrk_ele = xt.find('HEAD/FILENAME')
>>> wrk_ele.text
'Test99.txt'
>>>

答案 2 :(得分:1)

正如mjv所指出的那样,如果你只能使用XML,那么发明类似XML的格式并没有什么意义。

但是:如果您要将XML用于数据包格式,则需要真正使用XML。您应该使用XML库来创建您的数据包,而不仅仅是解析它们。否则,当您的一个字段值第一次包含XML标记字符时,您会感到悲伤。

当然,您可以编写自己的代码来进行必要的转义,过滤掉非法字符,保证格式良好等。对于这种简单的格式,这可能就是您需要做的。但是沿着这条路走下去是一种学习XML的方法,你可能不想学习它。

如果使用XML库来创建数据包是一个问题,那么最好定义一个自定义格式(我会定义一个看起来不像XML的东西,以防止人们获取想法)和使用pyparsing为它构建解析器。