我正在使用正则表达式来计算包含实数和加法的字符串的值,例如“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/