如何过滤嵌套的案例以过滤掉python

时间:2013-08-20 03:32:52

标签: python python-2.7 compare

我有一个ascii纯文本文件输入文件,主要案例和嵌套大小写如下: 我想在开关($ specific-trap)下比较下面输入文件中的详细信息和@ExtendedAttr = nvp_add函数之间的'$'实例,但是当我在python脚本部分下运行脚本时,所有嵌套的情况都是也打印出来,我不希望嵌套的情况在这里打印出来,脚本只考虑在switch下的情况($ specific-case)。我该怎么做这个帮助! :

Input file:
************
case ".1.3.6.1.4.1.27091.2.9": ###  - Notifications from JNPR-TIMING-MIB (1105260000Z)

    log(DEBUG, "<<<<< Entering... juniper-JNPR-TIMING-MIB.include.snmptrap.rules 
 >>>>>")

    @Agent = "JNPR-TIMING-MIB"
    @Class = "40200"

    $OPTION_TypeFieldUsage = "3.6"

    switch($specific-trap)
    {
        case "1": ### trapMsgNtpStratumChange

            ##########
            # $1 = trapAttrSource
            # $2 = trapAttrSeverity
            ##########

             $trapAttrSource = $1
             $trapAttrSeverity = lookup($2, TrapAttrSeverity)

             $OS_EventId = "SNMPTRAP-juniper-JNPR-TIMING-MIB-trapMsgNtpStratumChange"

             @AlertGroup = "NTP Stratum Status"
             @AlertKey = "Source: " + $trapAttrSource
             @Summary = "NTP Stratum Changes" + " ( " + @AlertKey + " ) "

        switch($2)
        {
            case "1":### clear
                $SEV_KEY = $OS_EventId + "_clear"
                @Summary = "End of: " + @Summary

                $DEFAULT_Severity = 1
                $DEFAULT_Type = 2
                $DEFAULT_ExpireTime = 0

            case "2":### none
                $SEV_KEY = $OS_EventId + "_none"

                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "3":### minor
                $SEV_KEY = $OS_EventId + "_minor"

                $DEFAULT_Severity = 3
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "4":### major
                $SEV_KEY = $OS_EventId + "_major"

                $DEFAULT_Severity = 4
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "5":### critical
                $SEV_KEY = $OS_EventId + "_critical"

                $DEFAULT_Severity = 5
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            default:
                $SEV_KEY = $OS_EventId + "_unknown"

                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
        }

        update(@Severity)

        $trapAttrSeverity = $trapAttrSeverity + " ( " + $2 + " )"

        @Identifier = @Node + " " + @AlertKey + " " + @AlertGroup + " " + 
      $DEFAULT_Type + " " + @Agent + " " + @Manager + " " + $specific-trap

        if(match($OPTION_EnableDetails, "1") or match($OPTION_EnableDetails_juniper,
      "1")) {
            details($trapAttrSource,$trapAttrSeverity)
        }
        @ExtendedAttr = nvp_add(@ExtendedAttr, "trapAttrSource", $trapAttrSource, 
     "trapAttrSeverit")

    case "2": ### trapMsgNtpLeapChange

        ##########
        # $1 = trapAttrSource
        # $2 = trapAttrSeverity
        ##########

        $trapAttrSource = $1
        $trapAttrSeverity = lookup($2, TrapAttrSeverity)

        $OS_EventId = "SNMPTRAP-juniper-JNPR-TIMING-MIB-trapMsgNtpLeapChange"

        @AlertGroup = "NTP Leap Status"
        @AlertKey = "Source: " + $trapAttrSource
        @Summary = "NTP Leap Changes" + " ( " + @AlertKey + " ) "

        switch($2)
        {
            case "1":### clear
                $SEV_KEY = $OS_EventId + "_clear"
                @Summary = "End of: " + @Summary

                $DEFAULT_Severity = 1
                $DEFAULT_Type = 2
                $DEFAULT_ExpireTime = 0

            case "2":### none
                $SEV_KEY = $OS_EventId + "_none"

                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "3":### minor
                $SEV_KEY = $OS_EventId + "_minor"

                $DEFAULT_Severity = 3
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "4":### major
                $SEV_KEY = $OS_EventId + "_major"

                $DEFAULT_Severity = 4
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            case "5":### critical
                $SEV_KEY = $OS_EventId + "_critical"

                $DEFAULT_Severity = 5
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0

            default:
                $SEV_KEY = $OS_EventId + "_unknown"

                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
        }

        update(@Severity)

        $trapAttrSeverity = $trapAttrSeverity + " ( " + $2 + " )"

        @Identifier = @Node + " " + @AlertKey + " " + @AlertGroup + " " + 
        $DEFAULT_Type + " " + @Agent + " " + @Manager + " " + $specific-trap

        if(match($OPTION_EnableDetails, "1") or match($OPTION_EnableDetails_juniper, 
       "1")) {
            details($trapAttrSource,$trapAttrSeverity)
        }
        @ExtendedAttr = nvp_add(@ExtendedAttr, "trapAttrSource", $trapAttrSource, 
       "trapAttrSeverity", $trapAttrSeverity)


Below is the code which I use suggested by Vaibhav Aggarwal one of the member in 
this stakeoverflow.

Python Script
**************

 import re


`caselines_index = []
 cases = []
 readlines = []

 def read(in_file):
 global cases
 global caselines_index
 global readlines
 with open(in_file, 'r') as file:
    for line in file.readlines():
       readlines.append(line.strip())
    for line in readlines:
       case_search = re.search("case\s\".+?\"\:\s", line)
         if case_search:
           caselines_index.append(readlines.index(line))
#print caselines_index
caselines_index_iter = iter(caselines_index)
int_line_index = int(next(caselines_index_iter))
int_next_index = int(next(caselines_index_iter))
while True:
  try:
    case_text = ' '.join(readlines[int_line_index:int_next_index]).strip()
    case = [readlines[int_line_index].strip(), case_text]
    cases.append(case)
    int_line_index = int_next_index
    int_next_index = int(next(caselines_index_iter))
  except StopIteration:
    case_text = ' '.join(readlines[int_line_index:len(readlines) - 1]).strip()
    case = [readlines[int_line_index].strip(), case_text]
    cases.append(case)
    break

def work():
  MATCH = 1
   for case_list in cases:
     details = []
     nvp_add = []
     caseline = case_list[0].strip()
     nvp = re.findall("details\(.+?\)", case_list[1].strip())

    for item in nvp:
        result_list = re.findall("(\$.+?)[\,\)]", item)

    for result in result_list:
        if "$*" not in result:
            details.append(result)

    nvp = re.findall("nvp_add\(.+?\)", case_list[1].strip())

    for item in nvp:
       result_list = re.findall("(\$.+?)[\,\)]", item)

    for result in result_list:
       if "$*" not in result:
          nvp_add.append(result)

missing_from_details, missing_from_nvp_add = [], []
missing_from_details = [o for o in nvp_add if o not in set(details)]
missing_from_nvp_add = [o for o in details if o not in set(nvp_add)]
if missing_from_nvp_add or missing_from_details:
  MATCH = 0
  print caseline + "   LINE - " + str(readlines.index(caseline) + 1)
  for mismatch in missing_from_details:
    print "Missing from details:"
    print mismatch
  for mismatch in missing_from_nvp_add:
    print "Missing from nvp_add:"
    print mismatch
  print "\n"
 if MATCH == 1:
   print "MATCH"
 else:
   print "MISMATCHES"


def main():
  in_file = "C:/target1.txt"
  read(in_file)
  work()


if __name__=="__main__":
main()

1 个答案:

答案 0 :(得分:0)

import re
from sys import stdout

#stdout = open("result.txt", 'w+')


def read(in_file):
  cases = []
  caselines_index = []
  readlines = []
  readlines_num = []
  with open(in_file, 'r') as file:
    readfile = file.read().strip()
    for line in readfile.split('\n'):
      readlines_num.append(line.strip())
    regex = re.compile("switch\(\$\d\).+?\}", re.DOTALL)
    readfile = re.sub(regex, ' ', readfile)
    for line in readfile.split('\n'):
      readlines.append(line.strip())
    for line in readlines:
      case_search = re.search("case\s\".+?\"\:\s", line)
      if case_search:
        caselines_index.append(readlines.index(line))
    #print caselines_index
    caselines_index_iter = iter(caselines_index)
    try:
      int_line_index = int(next(caselines_index_iter))
    except:
      print "No cases found"
    try:
      int_next_index = int(next(caselines_index_iter))
    except:
      int_next_index = len(readlines) - 1
    while True:
      try:
        case_text = ' '.join(readlines[int_line_index:int_next_index]).strip()
        match1 = re.search("nvp_add", case_text)
        match2 = re.search("details", case_text)
        if match1 or match2:
          case = [readlines[int_line_index].strip(), readlines_num.index(readlines[int_line_index]) + 1, case_text]
          cases.append(case)
        int_line_index = int_next_index
        int_next_index = int(next(caselines_index_iter))
      except StopIteration:
        case_text = ' '.join(readlines[int_line_index:len(readlines) - 1]).strip()
        case = [readlines[int_line_index].strip(), readlines_num.index(readlines[int_line_index]), case_text]
        cases.append(case)
        break
  return cases

def work(cases):
  MATCH = 1
  for case_list in cases:
    details = []
    nvp_add = []
    caseline = case_list[0].strip()
    nvp = re.findall("details\(.+?\)", case_list[2].strip())

    for item in nvp:
      result_list = re.findall("(\$.+?)[\,\)]", item)

      for result in result_list:
        if "$*" not in result:
          details.append(result)

    nvp = re.findall("nvp_add\(.+?\)", case_list[2].strip())

    for item in nvp:
      result_list = re.findall("(\$.+?)[\,\)]", item)

      for result in result_list:
        if "$*" not in result:
          nvp_add.append(result)

    missing_from_details, missing_from_nvp_add = [], []
    missing_from_details = [o for o in nvp_add if o not in set(details)]
    missing_from_nvp_add = [o for o in details if o not in set(nvp_add)]
    if missing_from_nvp_add or missing_from_details:
      MATCH = 0
      print caseline + "   LINE - " + str(case_list[1] + 1)
      for mismatch in missing_from_details:
        print "Missing from details:"
        print mismatch
      for mismatch in missing_from_nvp_add:
        print "Missing from nvp_add:"
        print mismatch
      print "\n"
  if MATCH == 1:
    print "MATCH"
  else:
    print "MISMATCHES"


def main():
  in_file = "target1.txt"
  cases = read(in_file)
  work(cases)


if __name__=="__main__":
  main()

这将过滤掉所有嵌套的开关。这仅适用于输入文件。