Разделите строку и сохраните разделители как часть фрагментов разделенной строки, а не как отдельные элементы списка.

Это побочный продукт Как в Python разделить строку и сохранить разделители?

rawByteString = b'\\!\x00\x00\x00\x00\x00\x00\\!\x00\x00\x00\x00\x00\x00'

Как я могу разделить этот rawByteString на части, используя \\! как разделитель, не отбрасывая разделители, так что я получаю:

[b'\\!\x00\x00\x00\x00\x00\x00', b'\\!\x00\x00\x00\x00\x00\x00']

Я не хочу использовать [b'\\!' + x for x in rawByteString.split(b'\\!')][1:], так как это будет использовать string.split() и является просто обходным путем, поэтому этот вопрос помечен модулем re.


person questionto42    schedule 26.06.2020    source источник
comment
@WiktorStribiżew import re rawByteString = b'\\!\x00\x00\x00\x00\x00\x00\\!\x00\x00\x00\x00\x00\x00' [x for x in re.split(b'(\\\\!)', rawByteString)][1:]: [b'\\!', b'\x00\x00\x00\x00\x00\x00', b'\\!', b'\x00\x00\x00\x00\x00\x00'] это не то, что мне нужно, мне нужно [b'\\!\x00\x00\x00\x00\x00\x00', b'\\!\x00\x00\x00\x00\x00\x00']   -  person questionto42    schedule 26.06.2020
comment
re.split(rb'(?!\A)(?=\\!)', rawByteString) см. ideone.com/L9n1V9.   -  person Wiktor Stribiżew    schedule 26.06.2020
comment
Посмотрите, подходит ли вам lst_Bytes = re.split(b'(?<!^)(?=\\\\!)', rawByteString)   -  person JvdV    schedule 26.06.2020
comment
Оба предложения работают.   -  person questionto42    schedule 26.06.2020
comment
@JvdV и Лоренц Шаблоны такие же, как (?!\A) = (?<!^), поскольку re.M не передается, а "\\\\" = r"\\"   -  person Wiktor Stribiżew    schedule 26.06.2020
comment
@WiktorStribiżew, хотя вы отметили его как похожий вопрос, вы можете добавить ответ, и я приму его.   -  person questionto42    schedule 26.06.2020
comment
Ну, дело в том, что вы использовали str.split, а не re.split. JvdV и я исправили шаблон регулярного выражения для вас, но вы могли бы сами прийти к этому решению, если бы использовали правильный шаблон с самого начала. Если вы отредактируете вопрос (показывая, что используете правильный метод, но по-прежнему не получаете ожидаемого результата), он может быть повторно открыт. Если это произойдет, я добавлю ответ. Если кто-нибудь знает лучший дубликат, не стесняйтесь изменить текущую дублирующую ссылку на тему или дайте мне знать.   -  person Wiktor Stribiżew    schedule 26.06.2020
comment
@WiktorStribiżew Я изменил вопрос, чтобы вообще не использовать решение string.split(), которое также соответствовало бы вашим требованиям. Возможно, он будет открыт повторно, так как это довольно специфический случай вопроса дубликата.   -  person questionto42    schedule 26.06.2020
comment
Я изменил заголовок, чтобы он показывал отличие от другого вопроса.   -  person Wiktor Stribiżew    schedule 27.06.2020
comment
Хорошо, я думал, что этот вопрос также отличается из-за rawByteString, и все же вы правы, решение не зависит от типа строки, регулярное выражение можно применить к любой строке, спасибо.   -  person questionto42    schedule 27.06.2020


Ответы (1)


Вы можете использовать

re.split(rb'(?!\A)(?=\\!)', rawByteString)
re.split(rb'(?!^)(?=\\!)', rawByteString)

См. пример регулярного выражения (ввод строки изменен, поскольку нулевые байты не могут быть частью строки) .

Сведения о регулярном выражении

  • (?!^) / (?!\A) / (?<!^) - позиция, отличная от начала строки
  • (?=\\!) - позиция, за которой сразу не следует обратная косая черта + !

ПРИМЕЧАНИЯ

  • Поскольку вы используете строку байтов, префикс b требуется при определении строкового литерала шаблона.
  • r делает строковый литерал необработанным строковым литералом, так что нам не нужно дважды экранировать обратную косую черту и можно использовать \\ для соответствия одному \ в строке.

См. демонстрацию Python:

import re
rawByteString = b'\\!\x00\x00\x00\x00\x00\x00\\!\x00\x00\x00\x00\x00\x00'
print ( re.split(rb'(?!\A)(?=\\!)', rawByteString) )

Выход:

[b'\\!\x00\x00\x00\x00\x00\x00', b'\\!\x00\x00\x00\x00\x00\x00']
person Wiktor Stribiżew    schedule 27.06.2020