我的文件有很多行,如下所示:
interface GigabitEthernet0/5/0/0.1 l2transport
blah
blah
interface TenGigabitEthernet0/5/0/0.1
blah
blah
我想逐行解析这个文件,以计算项目的出现次数。
我上面展示的这一行有很多我要解析/计算/识别的细节:
如果该行的千兆位增加计数器为1,则为TenGig,增加另一个计数器
如果该行有一个点(。),那么也会增加第二个计数器。
如果该行最后有一个点(。)和一个l2transport
,那么也会增加第3个计数器。
如果该行最后有一个点(。)而没有l2transport
,那么请增加4号计数器。
如果不使用CPU昂贵的正则表达式来完成上述操作会有什么好方法?
答案 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
对Gigabit
,TenGig
和line.endswith('l2transport')
的检查是相互独立的,因此我们需要所有if's
,该行将以l2transport
结尾或不是if/elif
会有效,我们也会在两种情况下都检查.
,因此我们不需要if或elif。
答案 1 :(得分:0)
Marpa::R2是Perl的Marpa, a general BNF parser界面,对此类内容非常有用。
此script输出
counters: 1, 1, 2, 1, 1
注意一般的BNF解析如何允许(1)确保输入符合规范(否则它不会解析)和(2)只获得与问题直接相关的结果(计数代码只是一对if
的{,与上面的字符串搜索功能一样。