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 refmt = (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")
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'}