
[̲̅i̲̅t̲̅j̲̅u̲̅n̲̅k̲̅y̲̅] ࢧ кибер-даос
28.06.2018
05:57:55
Тут надо подробнее кейсы рассмотреть

Alexander
28.06.2018
05:58:08

[̲̅i̲̅t̲̅j̲̅u̲̅n̲̅k̲̅y̲̅] ࢧ кибер-даос
28.06.2018
05:58:09
Но регулярки и правда выглядят прямо тем что надо

Aragaer
28.06.2018
05:58:51
но почему-то если именно так пытаться делать, чот не получается. Косячу?

Google

[̲̅i̲̅t̲̅j̲̅u̲̅n̲̅k̲̅y̲̅] ࢧ кибер-даос
28.06.2018
05:58:56
Кстати, а у тебя матчит нормальнг? А то массив байт и массив чисел это не одно и тоже

Aragaer
28.06.2018
05:59:44
re.match(bytes([32]), bytes([31,32,33,34])) - тут не мачит
хм
а, я тупой

Митяй
28.06.2018
06:01:21
Вышел долгожданный Python 3.7.0.
Из новинок:
- встроенная функция breakpoint
- Data Classes
- словари теперь хранят порядок при добавлении ключей (прощай, OrderedDict)
и т.д. Более подробный список изменений можно посмотреть по ссылке — https://www.python.org/downloads/release/python-370/

Aragaer
28.06.2018
06:01:37
>>> re.search(bytes([32]), bytes([31,32,33,34]))
<_sre.SRE_Match object; span=(1, 2), match=b' '>
крч я привык, что в перле матч это "где угодно", а в питоне это search
ну только да, для байтов надо писать регулярки вида
b'\x01{3}.\x02{3}'
>>> r = bytes(ord('.') if x is None else x for x in pattern)
>>> re.search(r, packet)
<_sre.SRE_Match object; span=(0, 7), match=b'\x01\x01\x01\x02\x03\x03\x03'>
>>> re.search(r, packet2)
<_sre.SRE_Match object; span=(0, 7), match=b'\x01\x01\x01\x05\x03\x03\x03'>
>>> re.search(r, packet3)
<ничего>
ну то есть надо более разумно сделать там из-за спецсимволов разных, но вот

Belegnar
28.06.2018
06:06:33

Aragaer
28.06.2018
06:09:48
Кому-нибудь попадалась адекватная imap либа с поддержкой idle? Потому что встроенная imaplib не умеет, а найденная мной imaplib2 не особо адекватная
хм. Нашел aioimaplib

Google

Иван
28.06.2018
06:14:53
aioimapllib далеко ещё не готова для промышленного использования...

Alexander
28.06.2018
06:15:21

Aragaer
28.06.2018
06:16:07
его надо заменять на \.
ну и всякие там квантификаторы тоже
в регекспах реально много разных символов, которые надо экранировать. Когда ты возишься с байтами, ты будешь на них натыкаться значительно чаще
поэтому вот так "генерить" регекспы не стоит, лучше пиши их руками

Pavel
28.06.2018
06:32:02
b'pattern' in b'packet'
а сколько байтов может быть лишними внутри паттерна?

Aragaer
28.06.2018
06:32:42
нет, там паттерны могут быть с "пропусками" - вайлдкардами

Alexander
28.06.2018
06:32:52

Pavel
28.06.2018
06:33:32

Alexander
28.06.2018
06:34:14

Pavel
28.06.2018
06:34:54
ты же сам говоришь, что позиции лишних байтов заведомо известны.

Aragaer
28.06.2018
06:35:04
ну на самом деле можно просто сэмулировать работу машины регулярных выражений
если требуется только два варианта - "конкретный байт" и "любой байт"
взять паттерн, разбить его на сегменты конкретный-любой-конкретный-любой
через find находится первое вхождение первого конкретного, далее последовательно проверяется полный матч
если нет, то полностью откатываем (квантификаторов у нас нет, значит полная длина отката всегда одинаковая) и повторяем find с предыдущей позиции

Pavel
28.06.2018
06:39:39
pattern = 'abc'
packet = 'a_____b____c'
такое должно матчиться?

Aragaer
28.06.2018
06:39:50
нет
если паттерн abc, то матчится только когда они строго подряд

Google

Pavel
28.06.2018
06:40:12
тогда я ничего не понял про пропуски байтов.

Aragaer
28.06.2018
06:41:07
потому что может быть паттерн ['a', 'b', None, 'c']

Alexander
28.06.2018
06:41:35

Aragaer
28.06.2018
06:41:44
которому соответствует b'abdc'

Pavel
28.06.2018
06:41:55

Alexander
28.06.2018
06:55:53
по мотивам. с конвертацией в регексп
https://ideone.com/iJFYqD
конвертация корявенько вышла
@aragaer спасибо за наводку

Konstantin
28.06.2018
06:57:20
Скрипт питона, не подключается к прокси
В чем трабла

Khrystyna
28.06.2018
06:58:37
Все привет. Ищу ментора в изучение Python на платной основе. Кого заинтересовало предложение ображайтесь, буду очень благодарна

Aragaer
28.06.2018
07:01:15
какой бюджет и какой уровень?
собственно ^ в начале означает, что ты ищешь паттерн только в самом начале пакета и все.
но re.match тоже ищет только в начале - тебе нужен re.search и без ^

Alexander
28.06.2018
07:05:29
мне и надо только вначале

Айдар
28.06.2018
07:08:39
OSError: [Errno 101] Network is unreachable
Как исправить?

Andy
28.06.2018
07:09:19
нет доступа, написано же

Aragaer
28.06.2018
07:09:38
ох, ну тогда же все значительно проще

Google

Aragaer
28.06.2018
07:13:50
если просто в начале, то действительно разумнее просто пойти циклом по блокам конкретный-none-конкретный

Alexander
28.06.2018
07:15:02

Aragaer
28.06.2018
07:18:59
ну... машина регекспов вполне может быть написана на си, так что ты компилируешь регексп и отдаешь в нативный код
но реально скорость зависит только от длины паттерна в этом случае

Alexander
28.06.2018
07:23:59
с регекспом болееменее понятно. Быстрее можно сделать только если самому замутить на Це под конкретные паттерны. Хочется проверить своё предположение что перебор в лоб, циклом, очень существенно медленнее.
Наверное самое простое, сгенерить миллион другой пакетов и измерить время обработки ...

Aragaer
28.06.2018
07:24:48
еще раз - длина пакета не роляет, если ты ищешь только в начале пакета
я думаю, что достаточно быстро можно делать такое:
>>> pattern=[1,2,3,None,4,5,6]
>>> packet=bytes([1,2,3,4,5,6])
>>> all(p is None or x==p for p, x in zip(pattern, packet))
False
>>> packet2=bytes([1,2,3,4,4,5,6])
>>> all(p is None or x==p for p, x in zip(pattern, packet2))
True

Alexander
28.06.2018
07:33:45
я думаю, что достаточно быстро можно делать такое:
>>> pattern=[1,2,3,None,4,5,6]
>>> packet=bytes([1,2,3,4,5,6])
>>> all(p is None or x==p for p, x in zip(pattern, packet))
False
>>> packet2=bytes([1,2,3,4,4,5,6])
>>> all(p is None or x==p for p, x in zip(pattern, packet2))
True
да, так интересней.
/me узнал новые питоновские заклинания :)

Vitaliy
28.06.2018
07:36:58
/me
/me

Bogdan (SirEdvin)
28.06.2018
07:40:00
/them

Vladimir
28.06.2018
07:43:33
Cоздаю пачку корутин через: loop.create_connection(lambda: ClientProtocol(loop, ip, port), потом запускаю через loop_res.run_until_complete(asyncio.gather(*coros)) , далее self.loop_res.run_forever(). Вопрос как в этот же loop добавить ещё таких коннектов? пытался так же создать и запустить run_until_complete , ругается что loop уже запущен

Aragaer
28.06.2018
07:44:47
когда луп запущен, то ensure_future (или конструктор Task) сразу же запускают
собственно твое run_until_complete(asyncio.gather) оно не особо надо, сразу можно run_forever
да, когда не запущен, то ensure_future ставит в очередь. Выполняться начнет, когда будет запущен

Nikolay
28.06.2018
07:51:42

Roman
28.06.2018
07:54:15

Alexander
28.06.2018
07:54:48

Roman
28.06.2018
07:57:48

Aragaer
28.06.2018
07:58:17
только в начале, уже выяснили

Google

Alexander
28.06.2018
07:58:46

Даня
28.06.2018
08:05:15
Подскажите, есть ли какой-то шорткат для документирующих комментариев. (не знаю, как их правильно назвать) Которые """ stuff here """

Aragaer
28.06.2018
08:05:32
эм
любая строчка же сгодится
def my_func():
"hello, world"
return 42
""" """ и ''' ''' это просто многострочные строковые литералы

Vladimir
28.06.2018
08:07:11

Даня
28.06.2018
08:07:23
Ну да, я про шорткат для многостроковых

Vladimir
28.06.2018
08:07:33
Ещё проблема в том что надо добавить в луп из другого потока.

Aragaer
28.06.2018
08:07:49
а три раза нажать кавычку, набрать текст и еще три раза нажать кавычку это сильно трудно?