【问题标题】:python: parse a colon-separated formatted stringpython:解析冒号分隔的格式化字符串
【发布时间】:2021-10-24 14:38:52
【问题描述】:

我需要编写一个python 脚本(我是python 的新手,但想练习一下)来解析以下格式的消息:

T:L:x1:x2:x3:...T1:L1:y1:y2:y3...Tn:Ln:z1:z2:z3:...

其中T 保存一个类型,L 是长度,x1..xn 是 T1-Tn 类型的实际数据。每个字符用: 符号分隔,所有值始终以十六进制表示。

例如:

1:4:a:5:6:7:2:10:72:75:63:6f:6e:74:72:6f:6c:6c:65:72:2e:6f:72:67

(Type1=1, Length1=4, Type2=2, Length2=16 (10 in hex))

解析后的消息应该存储在字典中(我认为这是最合适的数据结构,但我很高兴听到一些其他建议)。

所以我可能会拆分文本,提取类型和长度,进一步提取L 字节并将它们存储在dict 中,T 作为键。

  1. 所以我会运行一个循环,我如何确定字符串的结尾,以便我可以跳出循环?
  2. 实际数据(例如 x1-x3...)必须存储在字典中,并删除 :。我不知道该怎么做。

我很高兴了解更有效的字符串解析方法。谢谢!

【问题讨论】:

  • 请举例说明您要解析的确切语法,而不是模板
  • @anon01,我更新了我的问题。
  • 你试过使用split字符串方法吗?
  • 我以前怎么没想到...我更新了我的答案。请检查一下好吗?
  • @Corralien,是的,它按预期工作。谢谢。

标签: python parsing


【解决方案1】:

这样的事情应该可以工作:

ss = "1:4:a:5:6:7:2:10:72:75:63:6f:6e:74:72:6f:6c:6c:65:72:2e:6f:72:67".split(":")

d = {}
idx = 0
while idx < len(ss):
    key = ss[idx]
    idx += 1
    length = int(ss[idx])
    idx += 1
    arr = ss[idx:idx+length]
    d[key] = arr
    idx += length

输出d:

{'1': ['a', '5', '6', '7'],
 '2': ['72', '75', '63', '6f', '6e', '74', '72', '6f', '6c', '6c'],
 '65': ['2e', '6f', '72', '67']}

【讨论】:

  • 我认为这不是预期的结果。
  • @Corralien 这遵循问题中概述的解析规则type:length:&lt;values&gt;。示例数据中可能存在拼写错误
【解决方案2】:

在你的字符串上创建一个iterator

message = '1:4:a:5:6:7:2:10:72:75:63:6f:6e:74:72:6f:6c:6c:65:72:2e:6f:72:67'

code = iter(message.split(':'))
data = {}

for t in code:
    l = int(next(code), 16)
    d = [next(code) for _ in range(l)]
    data[t] = d

输出:

>>> data
{'1': ['a', '5', '6', '7'],
 '2': ['72', '75', '63', '6f', '6e', '74', '72', '6f', '6c', '6c', '65', '72', '2e', '6f', '72', '67']}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多