help parsing ipv6 addresses and subnets

Discussion in 'Python' started by Prabhu Gurumurthy, Nov 8, 2007.

  1. 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()
     
    Prabhu Gurumurthy, Nov 8, 2007
    #1
    1. Advertisements

  2. Thorsten Kampe, Nov 8, 2007
    #2
    1. Advertisements

  3. Prabhu Gurumurthy

    Hyuga Guest

    And even if you do end up doing the IPv6 parsing yourself (which you
    shouldn't), regular expressions would be the wrong approach--there's
    no way an RE can deal with replacing a :: with the correct number of
    zeroes, among other complications.

    Hyuga
     
    Hyuga, Nov 8, 2007
    #3
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.