Python 字符串解析

0 投票
3 回答
1358 浏览
提问于 2025-04-15 16:48

我正在开发一个数据包提取系统,这个系统会接收一个数据包,并根据一套标签系统(类似于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 个回答

1

正如mjv所说,如果你可以直接使用XML,那就没有必要去发明一种类似XML的格式。

但是,如果你决定用XML作为你的数据包格式,那就真的要好好使用XML。你应该使用一个XML库来创建你的数据包,而不仅仅是用来解析它们。否则,当你的某个字段值里包含XML标记字符时,你就会遇到麻烦。

当然,你可以自己写代码来处理这些问题,比如转义字符、过滤掉不合法的字符、确保格式正确等等。对于这么简单的格式,这可能就是你需要做的全部。但走这条路可能会让你学到一些关于XML的知识,而这些知识你可能并不想学。

如果使用XML库来创建数据包有困难,那你可能更适合定义一个自定义格式(而且我建议这个格式看起来不要像XML,以免让人产生误解),然后用pyparsing来为它构建一个解析器。

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

如果数据包的格式看起来像是XML的样子(也就是说,如果“结束标签”里真的有一个斜杠),那么可以使用xml.etree.ElementTree这个库。
这个库是Python标准库的一部分,从Python 2.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'
>>>

撰写回答