代码之家  ›  专栏  ›  技术社区  ›  Am1rr3zA

使用正则表达式从python中的readline()获取一些子字符串

  •  1
  • Am1rr3zA  · 技术社区  · 15 年前

    我使用tcpdump来嗅探我的netrok包,我想从存储的文件中获取一些信息。我的文件有两行语法分隔的行,但它们重复了很多次。

    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 55731)和 抵消 (23:30:43.170344)从第一行(我的档案上都是这样的行)。并存储在不同的列表中。

    得到2 分离IP (192.168.98.138.49341和201.20.49.239.80)和 SEQ (顺序562034569:562034972)和 ACK (ACK 364925832)从第二行(我文件中的所有行都是这样)开始,存储在不同的列表中。

    如果能用正则表达式做到这一点,那对我来说就更好了。

    1 回复  |  直到 15 年前
        1
  •  2
  •   pyfunc    15 年前

    对于第一部分,获取时间戳、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模块的阅读: