Python 3.x AttributeError:' NoneType'对象没有属性" groupdict'

时间:2015-06-12 07:07:13

标签: python regex python-3.x

作为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")

4 个答案:

答案 0 :(得分:3)

当正则表达式与给定字符串不匹配时,Python中的正则表达式函数返回None。因此,在您的情况下,matchNone,因此调用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)

以下是了解错误的步骤:

  1. 'NoneType'对象没有属性'groupdict'表示您在包含None的对象上调用方法groupdict()。查看代码,变量match包含“无”。

  2. match初始化在哪里?就在此之前,re.search()

  3. 查看python中正则表达式用法的文档:https://docs.python.org/3.4/library/re.html#match-objects所以re.search()返回一个None对象,如果正则表达式与主题字符串不匹配,则完全正常。然后在不控制其值的情况下调用此None对象上的方法。

  4. 其他解决方案,替换

    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