Добавление чисел в строку

У меня есть строка в качестве ввода для кода, который я пишу, и пусть пример строки:

"12 inches  makes   1   foot"

Моя цель - запустить мой код через эту строку и просто вытащить целые числа и добавить их. Таким образом, вывод для строки выше будет 13. Я использую try и за исключением здесь, так как другая примерная строка ввода может быть чем-то вроде "pi равно 3.14".

msg= "12    inches  makes   1   foot"

thesum = 0

s= msg.split()

for a in s:

    try:

        if a == int(a):
            a= int(a)
            thesum += a
        print (thesum)
    except ValueError as e:


        print("Value Error: no int present")

Я сделал то, что выше, и я не получаю его, чтобы добавить значение a (если это int) к "thesum". Как я могу заставить это работать? Кроме того, я хочу иметь его в try, кроме формата, чтобы я мог вызвать ValueError

Ответ 1

a str, а int(a) - int (если возможно), поэтому a == int(a) никогда не будет равным.

просто добавьте значение int(a), если преобразование завершится неудачно, оно поднимет ValueError.

Следующие коды должны работать.

msg= "12    inches  makes   1   foot"
thesum = 0
s= msg.split()
for a in s:
    try:
        thesum += int(a)
    except ValueError as e:
        print a
print thesum

Ответ 2

Нет необходимости проверять равенство со строкой. На самом деле попробуйте '4' == 4 в интерпретаторе. Ответ False, потому что строки и целые числа никогда не эквивалентны. Просто поставьте thesum += int(a) в цикл вместо вашего оператора if. Если вы не хотите try - except, используйте if a.isdigit(): вместо try: и вытащите except: в целом:

for a in s:
    if a.isdigit():
        thesum += int(a)
        print(thesum)

Хорошим способом было бы сочетание нескольких встроенных модулей:

string = "12 inches makes 1 foot"
total = sum(map(int, filter(str.isdigit, string.split())))

filter() находит только символы, которые являются цифрами. Затем мы преобразовываем каждый в целое число с map() и находим общее число с sum().

Ответ 3

Мне нравится "re" и понимание, чтобы было легче читать:

import re
print(sum(int(a) for a in re.findall(r'\d+', '12 inches make 1 foot')))

Затем вы можете расширить регулярное выражение для float и т.д.

Ответ 4

В большинстве предыдущих подходов скидка на второй вход, который равен "pi равно 3,14". Хотя вопрос был задан с заявленным утверждением синтаксического анализа целого числа. Для обработки второго ввода требуется обработка чисел как float.

import unittest
import re


def isDigit(s):
 return re.match(r'[\d.]+', s)

def stringParse(input):
 input = [i.strip() for i in input.split()]
 input = filter(lambda x: isDigit(x), input)
 input = map(lambda x: float(x), input)
 return sum(input)

class TestIntegerMethods(unittest.TestCase):

 def test_inches(self):
  self.assertEqual(stringParse("12 inches  makes   1   foot"), 13.0)

 def test_pi(self):
  self.assertTrue(stringParse('pi is 3.14'), 3.14)

if __name__ == '__main__':
 unittest.main()

Другой вопрос о проблеме