使用Python查找分离和处理重复的行块

时间:2014-05-10 11:03:42

标签: python regex python-2.7

我写了一个脚本来分析包含要找到的行的文本:

Uplink Bytes:                   6168  Downlink Bytes:               40366
Uplink Packets:                   69  Downlink Packets:                72
Access list name     Pkts-Down Bytes-Down    Pkts-Up   Bytes-Up   
tcp                      14       3763         15       1622 
web                      58      36603         54       4546
<....>

它为具有单独访问列表(如tcp和web)的字符串的列中的数字求和,然后将总和与前2个字符串中的总数进行比较。我编写了这个程序,它使用regualr表达式和结果组来帮助完成这三种类型的字符串。

现在我正在考虑如果文本中的输出很少,如何使它工作?什么是最优雅的方式来实现它? 我知道我需要在处理完第一个块之后将计数器重置为0并再次搜索所有这三种类型的字符串但是如何以最佳方式执行此操作?  这是当前的脚本:

import re


with open(input_file) as f:
            d_b = 0
            d_p = 0
            u_b = 0
            u_p = 0

    lines = f.readlines()
    for line in lines:
        res = re.search('Uplink B\w+: +(\d+) +Downlink \w+: +(\d+)',line) 
        if (res):
            s_u_b = int(res.group(1))
            s_d_b = int(res.group(2))                        

        res = re.search('Uplink P\w+: +(\d+) +Downlink \w+: +(\d+)',line)
        if (res):    
            s_u_p = int(res.group(1))
            s_d_p = int(res.group(2))

        res = re.search('^[0-9a-zA-Z-_]+\ +(\d+) +(\d+) +(\d+) +(\d+) +\d+',line)   
        if (res):
            d_p += int(res.group(1))
            d_b += int(res.group(2))
            u_p += int(res.group(3))
            u_b += int(res.group(4))

if (d_b == s_d_b) and (u_b == s_u_b) 
and (d_p == s_u_p) and (u_p == s_u_p):
    print("No mismatch between subsession stats and ECS stats found")

else :
    print("Mismatch between subsession stats and ECS stats found:")

1 个答案:

答案 0 :(得分:0)

我将介绍块边界的概念,当您使用"Uplink Bytes:"或空行(如果这些块之间存在一个)时,可以看到这种情况。

当您检测到进入新区块时,您将重置所有计数器。

您仍然可以逐个处理所有行。

根据您为每个块计算的数据要做什么,您可能希望将所有计数器和一些相关代码封装到一个小类中。