Поможете распарсить строку?

Доброго времени суток уважаемые!

Была у меня задача, передать по одному изображению в секунду с удаленного Raspberry на сервер. Сервер берет картинку и обнаруживает на ней людей, выделяет в квадратик и пересохраняет.
Сначала сделал по HTTP, потом понял что это просто трындец какой-то. Переписал на TCP с Twisted. На сервере Twisted, а на Raspberry простое подключение по TCP (connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)). Вроде сначала проблем небыло, а потом я начал замечать, что у мне на сервере запросы склеиваются и все падает из-за не валидных данных. Сделал некоторые наметки, если я не на правильном пути то сразу скажите, перепишу)

# Ключи
PUSHDATA_COMMAND = bytes('@PUSHDATA', encoding='utf-8')
END = bytes("@END", encoding='utf-8')

class DetectServerProtocol(LineReceiver):

    def handle_WORK(self, data=None):
        # Сначала я из кусочков делаю стек
        self.chunks.append(data)

        # Если data заканчивается на END, то считаем что это конец данных
        if data.endswith(END):
            full_data = b"".join(self.chunks).split(END)[0]
            # сейчас у меня такая фигня. Работает, но если данные идут
            # друг за другом без интервала
            # (например если на Raspberry произошла задержка),
            # то получаю склеенные данные,
            # а когда заканчивается на END получаю уже не валидные данные.

            self.chunks = [] # Очищаю стек
            # Если начинается с PUSHDATA_COMMAND, то делаем то и то
            if full_data.startswith(PUSHDATA_COMMAND):
                pass


Строка может начинаться с любого символа и содержать в себе любые символы в том числе @, но вероятно последовательность "@@" не будет встречаться никогда (но могу и ошибаться). Далее идет блок @PUSHDATA .... @END, это как раз и есть данные. Но иногда мне приходят вот такие строки, будем считать эту строку за test регулярного выражения:
"@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:timestamp:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf"


Ну надеюсь суть проблемы понятна. Помогите составить регулярное выражение! Я сам убил часов 5 на решение этой задачи. Так и не добившись результата...
Грубо говоря какая бы строка не пришла мне нужно во-первых, понять есть ли в ней целые блоки, во вторых получить эти блоки вместе с ключами или без не так важно.
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 1
sim3x
@sim3x
s = "@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:timestamp:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82....\x81\xce@END@PUSHDATA:1234567890:\xcf\x84o\xcf"

print( [_.replace('@END', '') for _ in s.split('@PUSHDATA:') if _] )


['1234567890:Ï\x84oÏ\x81νoÏ\x82....\x81Î',
 'timestamp:Ï\x84oÏ\x81νoÏ\x82....\x81Î',
 '1234567890:Ï\x84oÏ\x81νoÏ\x82....\x81Î',
 '1234567890:Ï\x84oÏ']
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы