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

时间:2015-12-13 01:41:02

标签: 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'

为什么会出现此错误,如何解决?

1 个答案:

答案 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>