作为python的初学者,我可能会错过某种基础知识。但我正在浏览一个项目中的一个代码并碰巧面对这个:
AttributeError:' NoneType'对象没有属性' groupdict'
以下是代码部分,虽然重新措辞,但这确实会导致同样的问题。
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")
答案 0 :(得分:3)
当正则表达式与给定字符串不匹配时,Python中的正则表达式函数返回None
。因此,在您的情况下,match
为None
,因此调用match.groupdict()
会尝试在任何内容上调用方法。
您应首先检查match
,然后在访问groupdict()
时也不需要捕获任何异常:
match = p.search('Total run time: 9h 34m 9s 901ms realtime, 7h 6m 29s 699ms uptime')
if match:
d = match.groupdict()
在您的特定情况下,表达式无法匹配,因为在一开始,它正在寻找+
符号。并且您的字符串中没有单个加号,因此匹配将失败。此外,在表达式中,不同时间值之间没有分隔符。
试试这个:
>>> 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'}
答案 1 :(得分:0)
此处,match
正在评估None
,即python中的NoneType
。
因此,您收到了错误。
您可以进行空检查以避免它,例如:
try:
if !(match is None):
d = match.groupdict()
答案 2 :(得分:0)
以下是了解错误的步骤:
'NoneType'对象没有属性'groupdict'表示您在包含None的对象上调用方法groupdict()
。查看代码,变量match
包含“无”。
match
初始化在哪里?就在此之前,re.search()
。
查看python中正则表达式用法的文档:https://docs.python.org/3.4/library/re.html#match-objects所以re.search()
返回一个None对象,如果正则表达式与主题字符串不匹配,则完全正常。然后在不控制其值的情况下调用此None对象上的方法。
其他解决方案,替换
try:
d = match.groupdict()
except IndexError:
print("exception here")
通过
if match is not None:
d = match.groupdict()
else:
print("re.search() returned None")
答案 3 :(得分:0)
如果re.search
失败(see),None
可以返回if match is not None:
d = match.groupdict()
,您应该在继续之前明确检查返回的结果:
JsPDF