2016-06-30 3 views
2

Я использую функцию split() для шестнадцатеричной строки в Python. Эта строка содержит маркер (0xffffffffffffffff), который я хочу разделить. После этого маркера есть шестнадцатеричные данные. В шестнадцатеричной строке может быть несколько «маркеров».Несколько совпадений по сплит-строке

Теперь я обнаружил, что проблема связана с тем, что моя первая строка данных заканчивается на «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 
+1

Я не могу сказать без кода, но 'rsplit()' приходит на ум. – TigerhawkT3

+1

@ TigerhawkT3 имеет хороший намек ;-), что заняло у меня некоторое время, было: пробелы, разделяющие 2-значные пакеты, вводятся только в этом вопросительном тексте, но в реальном вводе данные ** не ** разделяются пробелами , правильно? – Dilettant

+0

@ Dilettant Это правильно. Пробелы просто применяются для лучшей читаемости. «Настоящая строка» не имеет пробелов. – iLLogical

ответ

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, но я не думаю, что есть какой-нибудь способ это.

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'] 
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'] 
Смежные вопросы