分裂字符串上的多个匹配项

时间:2016-06-30 10:55:40

标签: python regex string split

我在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

3 个答案:

答案 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']