我正在研究一种传感器,该传感器一次可发出1000个十六进制读数。
传感器的响应结果如下所示- 4024f003503140402510033031204024f0038030d04024f0036030a04024e0039030c040254003
我必须首先将其拆分为14个字符,例如,一个读数为4024f003503140,还需要将其拆分为[40,24f0,0350,3140]并从每个列表中删除40,最后得到输出[24f0,0350,3140]
我试图通过一种for循环来寻找解决方案和大多数答案,但是大多数情况下它们的字符长度相似。 有什么巧妙的方法可以解决这个问题吗?
答案 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)