我正在使用正则表达式来计算包含实数和加法的字符串的值,例如'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'
为什么会出现此错误,如何解决?
答案 0 :(得分:1)
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)
:
>>> '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
正如Kevin Guan评论的那样,使用str.split()
会更好;易读,简单:
$(document).ready(function(){
var sum = 0;
$(document).on('click', '.myaddButton', function() {
var $foodname = $(this).closest("tr") // Finds the closest row <tr>
.find(".nr") // Gets a descendent with class="nr"
.text();
var $foodprice = $(this).closest("tr") // Finds the closest row <tr>
.find(".rn") // Gets a descendent with class="nr"
.text();
$('#carttable').prepend("<tr class='danger' id ='myTableRow'><td>"+$foodname+"</td><td class='price'>"+$foodprice+"</td> <td> <button class='deletebutton btn btn-danger' type='button'> <span class='glyphicon glyphicon-trash'></span> </button> </td></tr>");
});
$(document).on('click', '.deletebutton', function() {
$('#myTableRow').remove();
//$('.price').each(function() {
// var $price = $(this);
//console.log($price);
//sum += parseInt($price.context.innerHTML);
//});
//$('#total').html(sum);
//sum = 0;
});
});
</script>