help parsing ipv6 addresses and subnets

Prabhu Gurumurthy pgurumur at gmail.com
Thu Nov 8 01:34:14 EST 2007


Hello list,

I would like to parse IPv6 addresses and subnet using re module in
python. I am able to either parse the ipv6 address or ipv6 network but
not both using single line. any help appreciated. BTW is there a
metacharacter for hex digits.

Thanks
Prabhu
-

---------------------------------------------------------------------
#!/usr/bin/env python2.5
# $Id: $

import re, os, Queue, sys
from optparse import OptionParser

# for debug purposes only
import pdb

argc = len(sys.argv)
(dirname, program) = os.path.split(sys.argv[0])

def error(Message):
   if Message:
      global program
      print "%s: %s" %(program, Message)
      sys.exit(1)

def cisco_parse(FileName):
   if FileName:
      fh = None
      if os.path.exists(FileName):
         try:
            fh = open(FileName, "r")
         except IOError, message:
            error(message)
         else:
            count = 0
            flag = True
            while flag:
               try:
                  lines = fh.next()
               except StopIteration:
                  flag = False
               else:
                  line = lines.strip()
                  rehex = "[A-Fa-f0-9]"
                  # to parse ipv6 address
                  format = \
                     "((%s{1,4}:?:){1,7}%s{1,4})" %(rehex, rehex)
                  # to parse ipv6 subnet
                  # format = \
                  #   "((%s{1,4}:?:){1,7}%s{1,4}(?=(::/\d{1,3})))"
%(rehex, rehex)
                  reip6 = re.compile(format)
                  match = reip6.search(line)
                  if match is not None:
                     tupleLen = len(match.groups())
                     if tupleLen == 2:
                        print count, match.groups()[0]
                     elif tupleLen == 3:
                        print count, match.groups()[0] + match.groups()[2]
                     count += 1

            fh.close()
            fh = None

def ParseCmdLine():
   parser = OptionParser(usage="%prog [options]", version="%prog 1.0")
   parser.add_option("-f", "--filename",
         help="cisco config to read", dest="file")

   (options, args) = parser.parse_args()

   fileName = None
   if options.file:
      fileName = options.file

   if fileName:
      cisco_parse(fileName)

if __name__ == "__main__":
   if argc <= 1:
      error("too few arguments, use -h or --help to view all options")
   else:
      ParseCmdLine()





More information about the Python-list mailing list