我在Python中的hexlified字符串上使用了split()函数。这个字符串包含一个我要拆分的标记(0xffffffffffffffff)。在此标记之后有十六进制数据。可以有多个"标记"在hexlified字符串。
现在我发现当我的第一个数据字符串以" ff"结束时出现问题。并且下一个标记直接跟随它(这种情况不常发生,但它会发生)。
有没有办法分开"右边界"?
0a 0b 0c 0d 0e 0f ff ff ff ff ff ff ff ff 0a 0b 0c ...
在这种情况下,我希望将字符串拆分为:
0a 0b 0c 0d 0e 0f ->ff ff ff ff ff ff ff ff<- 0a 0b 0c ...
但它是这样分裂的:
0a 0b 0c 0d 0e 0 ->f ff ff ff ff ff ff ff f-> f 0a 0b 0c ...
知道如何在python中实现它吗?
目前的代码非常简单:
a = "0a0b0c0d0e0fffffffffffffffff0a0b0c"
list = a.split("ffffffffffffffff")
[0]: 0a0b0c0d0e0
[1]: f0a0b0c
但它应该是:
[0]: 0a0b0c0d0e0f
[1]: 0a0b0c
答案 0 :(得分:2)
您可以将字符串转换为bytes
/ bytearray
并将其拆分
In [2]: b = bytes.fromhex(s).split(b'\xff'*8)
In [3]: b
Out[3]: [b'\n\x0b\x0c\r\x0e\x0f', b'\n\x0b\x0c']
然后将列表中的每个元素转换回str
In [4]: [x.hex() for x in b]
Out[4]: ['0a0b0c0d0e0f', '0a0b0c']
答案 1 :(得分:1)
您可以分两步完成:首先,将数字分组成对,然后分成8组ff
:
>>> a = "0a0b0c0d0e0fffffffffffffffff0a0b0c"
>>> b = re.sub(r"(?<=\w{2})(\w{2})", r" \1", a)
>>> re.split(r"(?:ff ){8}", b)
['0a 0b 0c 0d 0e 0f ', '0a 0b 0c']
(可选)将结果重新加入:
>>> [s.replace(" ", "") for s in _]
['0a0b0c0d0e0f', '0a0b0c']
当然,如果第一个号码以ff
结尾或第二个号码以ff
开头,这仍然会失败,但我不认为有任何解决办法。< / p>
答案 2 :(得分:0)
要正确解析十六进制的8位数字序列,您只需将其视为字符对。
以下简单拆分函数在固定子字符串上拆分字符串,但仅在偶数位置拆分。它保留了形成十六进制数字的字符对。
def split_even(string, sep):
index = 0
while index >= 0:
index = string.find(sep, index)
if index == -1:
yield string
elif index % 2:
index += 1
else:
yield string[:index]
string = string[index + len(sep):]
index = 0
hexs = "001f" + "ffff" + "f23344" + "ffff" + "55"
ffs = "ffff"
print(list(split_even(hexs, ffs)))
# ['001f', 'f23344', '55']