Python 3.x Attributeerror: 'nonetype' Object Has No Attribute 'groupdict'
Solution 1:
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')
ifmatch:
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'}
Solution 2:
Here, match
is evaluating to None
, which is NoneType
in python.
Hence, you are getting the error.
You can put a null check to avoid it, like:
try:
if !(match is None):
d = match.groupdict()
Solution 3:
As re.search
can return None
if it fails (see), you should check the returned result explicitly before proceeding:
ifmatch is not None:
d = match.groupdict()
Solution 4:
Here are the steps to understand the error:
'NoneType' object has no attribute 'groupdict' means you are calling the method
groupdict()
on an object containing None. Looking at your code, the variablematch
contains 'None'.Where is
match
initialised ? Just before, withre.search()
.Looking at the documentation for regular expression usage in python: https://docs.python.org/3.4/library/re.html#match-objects So
re.search()
returns a None object, wich is completely normal if the regexp doesn't match your subject string. Then you call a method on this None object without controlling its value.
A solution among other, replace
try:
d = match.groupdict()
except IndexError:
print("exception here")
by
ifmatch is not None:
d = match.groupdict()
else:
print("re.search() returned None")
Post a Comment for "Python 3.x Attributeerror: 'nonetype' Object Has No Attribute 'groupdict'"