Python 如何迭代包含多个字符的字符串并识别浮点和整数?

Python 如何迭代包含多个字符的字符串并识别浮点和整数?,python,Python,我正在尝试迭代下面的输入字符串。如果遇到float或int,我希望将元素推送到堆栈中。当我遇到运算符“+-/*”或括号“()”或“=”时,我执行其他操作。我遇到的麻烦是识别浮点或整数。人们建议正则表达式将这些项分解为字符串列表,但我仍然有将这些项标识为浮点或int的问题。我尝试了isinstance(),但这也不起作用 投入: theInput1 = "3.2+.4*5.67/6.145=" theInput2 = "11.897/3.4+9.2-0.4*6.9/1

我正在尝试迭代下面的输入字符串。如果遇到float或int,我希望将元素推送到堆栈中。当我遇到运算符“+-/*”或括号“()”或“=”时,我执行其他操作。我遇到的麻烦是识别浮点或整数。人们建议正则表达式将这些项分解为字符串列表,但我仍然有将这些项标识为浮点或int的问题。我尝试了isinstance(),但这也不起作用

投入:

theInput1 = "3.2+.4*5.67/6.145="
theInput2 = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="
theInput3 = "234+34*65="
theInput4 = "(12+3)*(56/2)/(34-4)="
一些我尝试过但不起作用的东西。(我添加到一个列表以模拟推送到堆栈,这样我就不必在这里剪切/粘贴整个堆栈类。)


我明白你的意思。在这种情况下,您不能真正使用
isinstance
。 相反,您需要检查每个数字的类型,但是
type()
将不起作用,因为它将始终返回字符串

这是一个奇怪但成功的方法

import re
theInput1 = "3.2+.4*5.67/6.145="
theInput1 = re.split('\+|\*|\-|=|\/',theInput1)[:-1]
numbers = []
for number in theInput1:
    if str(float(number)) == number:numbers.append(float(number))
    elif str(int(float(number))) == number:numbers.append(int(float(number)))
输出

[3, 5.67, 6.145]

您应该做的第一件事是从列表中提取所有数字(浮点或整数)。一个很好的方法是使用正则表达式:

import re
input = '11.897/3.4+9.2-0.4*6.9/12.6-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
更多信息可在此处找到:

然后我们可以遍历它们并将它们转换为浮点:

nums = [float(num) for num in nums]
您的
instanceof
解决方案不起作用的原因是,字符串中的所有项都是字符,它们永远不会是float或int类型。此外,它会将
3.21
等数字分割为
3
2
1
,所以我们不知道它的
3.2
1
是分开的还是
3.21

如果您有任何问题,请告诉我:)

请尝试以下代码:

dataStr = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="

list = []

number = ''
for ch in dataStr:
    if ch.isdigit() or ch == '.':
        number +=ch
    else:
        list.append(number)
        number = ''
        # do other thing
        print(ch)

print(list)
结果:

/
+
-
*
/
-
=
['11.897', '3.4', '9.2', '0.4', '6.9', '12.6', '16.7']

借用mushycow
re
方法:

import re


def re_handling(input_str):
    print(f"Interpreting {input_str}")
    numbers_list = []
    nums = re.findall('([0-9.]+)', input_str, re.DOTALL)

    for num in nums:
        if float(num).is_integer():
             numbers_list.append(int(num))
        else:
             numbers_list.append(float(num))

    return numbers_list

theInput1 = "3.2+.4*5.67/6.145="
theInput2 = "11.897/3.4+9.2-0.4*6.9/12.6-16.7="
theInput3 = "234+34*65="
theInput4 = "(12+3)*(56/2)/(34-4)="

print(re_handling(theInput1))
print(re_handling(theInput2))
print(re_handling(theInput3))
print(re_handling(theInput4))
产出:

Interpreting 3.2+.4*5.67/6.145=
[3.2, 0.4, 5.67, 6.145]
Interpreting 11.897/3.4+9.2-0.4*6.9/12.6-16.7=
[11.897, 3.4, 9.2, 0.4, 6.9, 12.6, 16.7]
Interpreting 234+34*65=
[234, 34, 65]
Interpreting (12+3)*(56/2)/(34-4)=
[12, 3, 56, 2, 34, 4]

我建立在@mushycow的答案之上,但我很想看看是否有人能想出更干净的东西

import re
input = '11.897/5+9.2-0.4*6.9/13-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
list = []
for i in nums:
  if '.' in i:
    list.append(float(i))
  else:
    list.append(int(i))
  
print(list)

在我的用例中,list.append()实际上是stack.push(float(i))或stack.push(int(i)。

这是一种比我的lmao更好、更干净的方法。这很好,但我并不真正希望生成float和int的列表。我希望迭代,确定元素是什么(float、int、操作符、parethes等)然后做一些事情。运算符和其他项很简单,因为您只需查看它是在“+-/”还是“()”中。因此,我想知道是否有一种方法可以将您所做的事情放入for/if循环中,以迭代后正则表达式字符串…我希望这是有意义的!@astrochun您介意在代码中显示这一点吗?是的,我正在研究一个答案。请参见下文。我还将避免使用变量
input
。它与内置的
input
函数冲突。Th但是,它不适用于只有整数的输入:“(12+3)*(56/2)/(34-4)=”。我不确定您还想做什么,但这只是一个if/else,用来说明在您分离出运算符后int与float的分离。@yogesh riyat我修改为在我的答案中添加列表。唯一的问题是,如果您有一个
4.
的数字,它实际上可以解释为整数。就我个人而言我更喜欢保持我的类型最简单,所以如果它是int,我就保持它是int。
import re
input = '11.897/5+9.2-0.4*6.9/13-16.7='
nums = re.findall('([0-9.]+)', input, re.DOTALL)
list = []
for i in nums:
  if '.' in i:
    list.append(float(i))
  else:
    list.append(int(i))
  
print(list)