如何确定字符串中是否有浮点数

时间:2019-05-13 05:17:19

标签: python string

我旨在打印用户输入列表中每个元素的列表。输出的列表将符号标识为字符串,将数字标识为浮点数,以将元素基本比较为浮点数和字符串。如果列表中的数字已经是浮点数,则输出无法正确打印。

expression_list = []
expression = "(3.1+2)*5"

for index in expression:
    try: 
        float_index = float(index)
        expression_list.append(float_index)
    except ValueError:
        expression_list.append(index)
print(expression_list)     

我希望输出为['(', 3.1, '+', 2.0, ')', '*', 5.0] 相反,我得到['(', 3.0, '.', 1.0, '+', 2.0, ')', '*', 5.0]

2 个答案:

答案 0 :(得分:2)

我将在此处使用re.findall

expression = "(3.1+2)*5"
output = re.findall(r'[()]|[^\w]+|(?:\d+(?:\.\d+)?)', expression)
print(output)

['(', '3.1', '+', '2', ')', '*', '5']

使用的模式是:

[()] | [^\w]+ | (?:\d+(?:\.\d+)?)

此匹配项:

[()]              an opening or closing parenthesis, as a separate match
[^\w]             any other non word character
(?:\d+(?:\.\d+)?  a number, with or without a decimal component

答案 1 :(得分:1)

之所以发生这种情况,是因为您的for循环for index in expression:遍历字符串的每个字符,因此它不会检查3.1是否为浮点数,而是检查3是否为浮点数,并且1是经过转换的浮点数,而float('3')=3.0是转换后的浮点数,因此您会看到结果。

In [8]: expression_list = [] 
   ...: expression = "(3.1+2)*5" 
   ...:  
   ...:  
   ...: for index in expression: 
   ...:     print(index) 
   ...:                                                                                                                                                                           
(
3
.
1
+
2
)
*
5

也许您可以以提取Tim's答案提供给您的浮点数和运算符和方括号的方式拆分字符串。

假设您具有该输出,您的代码将按预期工作

import re

expression_list = []
expression = "(3.1+2)*5"

literals = re.findall(r'[()]|[^\w]+|(?:\d+(?:\.\d+)?)', expression)

for index in literals:
    try:
        float_index = float(index)
        expression_list.append(float_index)
    except ValueError:
        expression_list.append(index)
print(expression_list)

输出将如预期的那样['(', 3.1, '+', 2.0, ')', '*', 5.0]