Python 3.x AttributeError: 'NoneType' object has no attribute 'groupdict'
Question: Being a beginner in python I might be missing out on some kind of basics. But
I was going through one of the codes from a project and happened to face this
:

> AttributeError: 'NoneType' object has no attribute 'groupdict'

Following is the section of code,re-phrased though,still this does result in
the same problem.

    
    
    import re
    
    fmt = (r"\+((?P<day>\d+)d)?((?P<hrs>\d+)h)?((?P<min>\d+)m)?"
           r"((?P<sec>\d+)s)?((?P<ms>\d+)ms)?$")
    p = re.compile(fmt)
    match = p.search('Total run time: 9h 34m 9s 901ms realtime, 7h 6m 29s 699ms uptime')
    try:
        d = match.groupdict()
    except IndexError:
        print("exception here")
    


Answer: Regular expression functions in Python return `None` when the regular
expression does not match the given string. So in your case, `match` is
`None`, so calling `match.groupdict()` is trying to call a method on nothing.

You should check for `match` first, and then you also don’t need to catch any
exception when accessing `groupdict()`:

    
    
    match = p.search('Total run time: 9h 34m 9s 901ms realtime, 7h 6m 29s 699ms uptime')
    if match:
        d = match.groupdict()
    

In your particular case, the expression cannot match because at the very
beginning, it is looking for a `+` sign. And there is not a single plus sign
in your string, so the matching is bound to fail. Also, in the expression,
there is no separator beween the various time values.

Try this:

    
    
    >>> expr = re.compile(r"((?P<day>\d+)d)?\s*((?P<hrs>\d+)h)?\s*((?P<min>\d+)m)?\s*((?P<sec>\d+)s)?\s*(?P<ms>\d+)ms")
    >>> match = expr.search('Total run time: 9h 34m 9s 901ms realtime, 7h 6m 29s 699ms uptime')
    >>> match.groupdict()
    {'sec': '9', 'ms': '901', 'hrs': '9', 'day': None, 'min': '34'}
    

