Python:AttributeError: 'NoneType'对象没有属性 'groups'

标签 python regex python-2.7

我正在使用正则表达式来计算包含实数和加法的字符串的值,例如“3.4+5.2”。这是代码:

import re

a = str(raw_input())

counter = a.count('+')
for i in range(counter):
    add = re.match('([\+\-]?\d+(?:\.\d+)?)\+([\+\-]?\d+(?:\.\d+)?)', a)
    temp = float(add.groups()[0]) + float(add.groups()[1])
    a = re.sub('([\+\-]?\d+(?:\.\d+)?)\+([\+\-]?\d+(?:\.\d+)?)', str(temp), a)
print a

它适用于:

>>> a = '3+4'
'7.0'
>>> a = '3+4+5'
'12.0'

但是,当我尝试添加两次以上时:

>>> a = '3+4+5+6'
7.07.0
    temp = float(add.groups()[0]) + float(add.groups()[1])
AttributeError: 'NoneType' object has no attribute 'groups'

为什么会出现这个错误,如何修复?

最佳答案

re.match()如果没有匹配则返回None。尝试访问groups会引发AttributeError。 (None.groups(...))

第一次迭代后,a 变为 7.07.0,其中没有 +。原因是 re.sub 替换所有匹配项,而不仅仅是第一个匹配项。

要使其仅替换第一次出现,您需要指定count:

a = re.sub('([\+\-]?\d+(?:\.\d+)?)\+([\+\-]?\d+(?:\.\d+)?)', str(temp), a, count=1)
<小时/>

正如 Kevinguan 评论的那样,使用 str.split()会更好;易于阅读,简单:

>>> '3+4+5+6'.split('+')
['3', '4', '5', '6']
>>> map(float, '3+4+5+6'.split('+'))
[3.0, 4.0, 5.0, 6.0]
>>> sum(map(float, '3+4+5+6'.split('+')))
18.0

关于Python:AttributeError: 'NoneType'对象没有属性 'groups',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247115/

相关文章:

python-2.7 - 仅对一行值应用复选框条件,否则在 Odoo10 中显示警告

python - 如何遍历数组数组中的键?

python - 如何交换不包含相同数量项目的两个元组的值?

python - python测试套件执行完成后执行函数

python-2.7 - 类型错误 : can't subtract offset-naive and offset-aware datetimes

r - 通过 strsplit 使用非贪婪正则表达式拆分字符串

c# - 正则表达式(匹配词+一些数字)C#

python - 由 Python 的卡住工具创建的独立可执行文件的 ImportError

python - 如何在 Python 中查找绑定(bind)方法的实例?

regex - 为什么有这么多不同的正则表达式方言?