【问题标题】:Parsing lines between \x02 and \x03 in Python在 Python 中解析 \x02 和 \x03 之间的行
【发布时间】:2018-11-19 20:24:04
【问题描述】:

我遇到了一个让我头疼的严重问题。

我有一个具有不同测量值的传感器的日志文件,它们都出现在子字符串 '\x02' 和 '\x03' 之间。但这里开始我的问题。我如何能够将子字符串之间的所有值放入一个新列表中。由于有许多测量值,而不仅仅是一个,它应该提供与 '\x02' 和 '\x03' 一样多的列表。

为了让您快速了解日志文件在我将其读入 python 后的外观: ['\x02sEA LMDscandata 1\x03\x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03']

我确实尝试了很多(搜索子字符串,搜索索引等..)并且无法帮助自己,我期待您的建议。

谢谢你

编辑1:

我需要 \x02 和 \x03 语句之间的单独列表。例如使用:

['\x02sEA LMDscandata 1\x03\x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03 \x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03']

所以第一个列表应该看起来像'list1= [sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1'] 和第二个类似。我需要一个 for 循环,但我无法想象如何实现它..

【问题讨论】:

  • 可以分享一下你试过的代码吗?
  • with open(file) as f: content = f.readlines() sub ='\x02' new = ("\n".join(s for s in content if sub.lower() in s.lower())) 举个例子

标签: python string list find substring


【解决方案1】:

我建议使用正则表达式:

>>> lines = ['\x02sEA LMDscandata 1\x03\x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03']

>>> import re
>>> [s for line in lines for s in re.findall('\x02(.*?)\x03', line)]

['sEA LMDscandata 1', 'sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1']

【讨论】:

    【解决方案2】:
    listfromreadlines = ['\x02sEA LMDscandata 1\x03\x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03']
    l1 = listfromreadlines[0]
    
    items = [x.replace('\x02', "").replace('\x03', "") for x in l1.split('\x03\x02')] 
    
    # Thinking you might have sub items between the delimiters, I can only assume
    # they are split by spaces:
    subitems = [x.split(" ") for x in items]
    

    【讨论】:

    • 我遇到了一个小问题,因为我的 readlines() 检索了一个列表,但我无法拆分列表。
    • 你的列表只有一个元素,所以我认为你很高兴得到它。如果列表中有多个项目,您可以尝试将我的所有代码放在一个循环中。我不明白为什么会有。但我已更新以反映您的评论
    • 通过 list[0].split 解决。非常适合第一次测量,但后面还有其他测量......像 `len(list[0]) = 60000' 和 'len(items) = 600' 所以还有 9 次测量。你能帮我写一个循环吗?
    【解决方案3】:

    与约翰的答案几乎相同,但更简单且更具可读性:

    l1 = '\x02sEA LMDscandata 1\x03\x02sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1\x03'
    items = l1.strip('\x03\x02').split('\x03\x02')
    print(items)
    # prints: ['sEA LMDscandata 1', 'sSN LMDscandata 0 1 10B2E77 0 0 5BB6 E4FC 5FA60C99 5FA8C92F F0 0 0 0 F5B2 3E8 1']
    

    【讨论】:

    • 它更具可读性吗?我看到你 strip 使用与 split 相同的分隔符。当然可以,但显式优于隐式。
    • @John 是的,因为它从末端strips 并拆分剩下的任何东西,对我来说它更简单
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多