使用正则表达式从Python的readline()中获取子字符串
我用tcpdump来抓取我的网络数据包,现在想从存储的文件中提取一些信息。我的文件里有两种不同的行,但它们重复了很多次。
23:30:43.170344 IP (tos 0x0, ttl 64, id 55731, offset 0, flags [DF], proto TCP (6), length 443)
192.168.98.138.49341 > 201.20.49.239.80: Flags [P.], seq 562034569:562034972, ack 364925832, win 5840, length 403
我想从第一行中提取时间戳(23:30:43.170344)、ID(id 55731)和偏移量(23:30:43.170344),然后把这些信息存到一个不同的列表里。所有的第一行都是这个格式。
然后,我还想从第二行中提取两个独立的IP地址(192.168.98.138.49341和201.20.49.239.80)、序列号(seq 562034569:562034972)和确认号(ack 364925832),同样把这些信息存到另一个列表里。所有的第二行也是这个格式。
如果能用正则表达式来实现那就最好了。
1 个回答
2
第一部分是获取时间戳、ID 和偏移量。
我知道这段正则表达式写得很粗糙。
>>> import re
>>> l = '23:30:43.170344 IP (tos 0x0, ttl 64, id 55731, offset 0, flags [DF], proto TCP (6), length 443)'
>>> k = re.compile(r'^([0-9:]+\.[0-9]+) IP \(.* id ([0-9]+), offset ([0-9]+).*\)')
>>> x = k.match(l)
>>> x.groups()
('23:30:43.170344', '55731', '0')
>>> x.groups()[0]
'23:30:43.170344'
>>> x.groups()[1]
'55731'
>>> x.groups()[2]
'0'
>>>
第二部分:
>>> l = '192.168.98.138.49341 > 201.20.49.239.80: Flags [P.], seq 562034569:562034972, ack 364925832, win 5840, length 403'
>>> k = re.compile(r'^([0-9.]+) > ([0-9.]+): .* seq ([0-9:]+), ack ([0-9]+).*')
>>> x = k.match(l)
>>> for y in x.groups(): print y
...
192.168.98.138.49341
201.20.49.239.80
562034569:562034972
364925832
关于 re 模块的更多信息: