如何按字符数的特定模式分割字符串?

时间:2019-08-17 13:19:06

标签: python

我正在研究一种传感器,该传感器一次可发出1000个十六进制读数。

传感器的响应结果如下所示- 4024f003503140402510033031204024f0038030d04024f0036030a04024e0039030c040254003

我必须首先将其拆分为14个字符,例如,一个读数为4024f003503140,还需要将其拆分为[40,24f0,0350,3140]并从每个列表中删除40,最后得到输出[24f0,0350,3140]

我试图通过一种for循环来寻找解决方案和大多数答案,但是大多数情况下它们的字符长度相似。 有什么巧妙的方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:1)

不确定这是否是您要寻找的东西:

smokes_cat

这给您:

  

['40','24f0','0350','3140']

如果添加:

sensor_input = "4024f003503140"
values = [sensor_input[:2], sensor_input[2:6],sensor_input[6:10], sensor_input[10:14]]
print(values)

然后您将“ 40”放在开头,结果是:

  

['24f0','0350','3140']

答案 1 :(得分:1)

我做了一些搜索,并找到了一个回旋处的答案。

import re
temp1 = re.findall('.{1,14}',temp)

for i,j in enumerate(temp1):
    temp1[i] = re.findall('.{1,4}',j[2:])
print(temp1)

感谢大家的回复。.@ Deepstop您的代码很棒。.但是我还是需要一些时间来理解它。.

答案 2 :(得分:1)

也许这会有所帮助(z表示传感器生成的字符串)

result = [x[2:] for x in re.findall("[a-zA-Z0-9]{14}",z)]

答案 3 :(得分:0)

据我了解,您需要一个列表列表,并且该列表的长度为14,000个字符,不会有任何错误,例如担心丢失或伪造的字符。

因此,嵌套列表推导将完成此工作。在此示例中,我将示例输入缩短了8个字符,以使其可以被14整除。这假定输入数据是完美的,并且不检查任何内容。

l = "4024f003503140402510033031204024f0038030d04024f0036030a04024e0039030c0"
print([[s[2:6], s[6:10], s[10:14]] for s in [l[m:m+14] for m in range(0, len(l), 14)]])

结果

[['24f0', '0350', '3140'], ['2510', '0330', '3120'], ['24f0', '0380', '30d0'], ['24f0', '0360', '30a0'], ['24e0', '0390', '30c0']]

另一种方法是使用生成器函数。此函数将返回一个由每组14个字符组成的列表。尽管对于14K字符来说,这不是真正的问题,但是它的内存效率更高,但是确实可以简化错误检查,如assert语句所示。结果是相同的。

l = "4024f003503140402510033031204024f0038030d04024f0036030a04024e0039030c0"
def sensor(l):
    assert len(l) % 14 == 0, f"Input length of {len(l)} is not a multiple of 14"
    for m in range(0, len(l), 14):
        s = l[m:m+14]
        assert s[:2] == "40", f"Missing Ack at position {m}"
        yield [s[:4], s[4:8], s[8:12]]

sensor_list = [s for s in sensor(l)]

print(sensor_list)