用一些细节解析一行

时间:2014-10-24 17:18:59

标签: python regex parsing

我的文件有很多行,如下所示:

interface GigabitEthernet0/5/0/0.1 l2transport
blah
blah

interface TenGigabitEthernet0/5/0/0.1 
blah
blah

我想逐行解析这个文件,以计算项目的出现次数。

我上面展示的这一行有很多我要解析/计算/识别的细节:

  • 如果该行的千兆位增加计数器为1,则为TenGig,增加另一个计数器

  • 如果该行有一个点(。),那么也会增加第二个计数器。

  • 如果该行最后有一个点(。)和一个l2transport,那么也会增加第3个计数器。

  • 如果该行最后有一个点(。)而没有l2transport,那么请增加4号计数器。

如果不使用CPU昂贵的正则表达式来完成上述操作会有什么好方法?

2 个答案:

答案 0 :(得分:3)

只需使用in operator来测试会员资格:

In [12]: s = "interface GigabitEthernet0/5/0/0.1 l2transport"

In [13]: "." in s and not s.endswith('l2transport')
Out[13]: False

In [14]: "." in s and  s.endswith('l2transport')
Out[14]: True

类似以下内容:

with open(infile) as f:
    for line in f:
        if " Gigabit" in line: 
            # inc counter 1
        if "TenGig" in line:
            # inc other counter
        if  "." in s and line.rstrip().endswith('l2transport'):
            # inc counter 3 and 2 as we know . is in the line also
        elif "." in s and not line.rstrip().endswith('l2transport'):
            # inc counter 4 and 2  as we know . is in the line also

GigabitTenGigline.endswith('l2transport')的检查是相互独立的,因此我们需要所有if's,该行将以l2transport结尾或不是if/elif会有效,我们也会在两种情况下都检查.,因此我们不需要if或elif。

答案 1 :(得分:0)

Marpa::R2PerlMarpa, a general BNF parser界面,对此类内容非常有用。

script输出

counters: 1, 1, 2, 1, 1

注意一般的BNF解析如何允许(1)确保输入符合规范(否则它不会解析)和(2)只获得与问题直接相关的结果(计数代码只是一对if的{​​,与上面的字符串搜索功能一样。