pyparsing часто упускается из виду как способ написания парсеров, которые могут быть хорошо читаемыми - быстро.
В этом случае time
представляет собой грамматический элемент в начале каждой строки tcpdump. address
представляет каждый из TCP-адресов. pp.Literal
используется по-разному для представления таких частиц, как, например, «IP» и «>». Я использовал suppress
метод, чтобы опустить элементы, которые не нужны из вывода.
Файл, который я обработал, - это ваша строка, повторяемая примерно десять раз, причем только конечная константа увеличивается в каждой строке.
>>> import pyparsing as pp
>>> time = pp.Word(pp.nums + '.:')
>>> address = pp.Word(pp.nums + '.')
>>> line = time.suppress() + pp.Literal('IP').suppress() + address + pp.Literal('>').suppress() + address + pp.Literal(':').suppress() + pp.Literal('UDP,').suppress() + pp.Literal('length').suppress() + pp.Word(pp.nums)
>>> with open('temp.txt') as lines:
... for a_line in lines:
... print (line.parseString(a_line).asList())
...
['192.140.3.20.38373', '240.240.255.250.8082', '542']
['192.140.3.20.38373', '240.240.255.250.8082', '543']
['192.140.3.20.38373', '240.240.255.250.8082', '544']
['192.140.3.20.38373', '240.240.255.250.8082', '545']
['192.140.3.20.38373', '240.240.255.250.8082', '546']
['192.140.3.20.38373', '240.240.255.250.8082', '547']
['192.140.3.20.38373', '240.240.255.250.8082', '548']
['192.140.3.20.38373', '240.240.255.250.8082', '549']
['192.140.3.20.38373', '240.240.255.250.8082', '550']