python - python 如何从字符串中提取简单数字表达式数字?

84 2

我想编码单位转换器,我需要从输入字符串中的单位中提取给定值。

为了在使用转换器时提供用户友好的体验,我希望用户能够在同一个字符串中输入值和单位。 我的问题是我想提取数字和字母,以便告诉程序和值,并将它们存储在两个不同的变量。 我使用 in 操作符来提取字母,这可以正常工作。 我还找到了一个从输入中获取数字的解决方案,但这对于带有指数的值不起作用。

a = str(input("Type in your wavelength:"))
if"mm" in a:
 print("Unit = Millimeter")
b = float(a.split()[0])

b 中存储像 567 mm 这样的简单输入是一个浮动,但我希望能够提取像 5*10**6 mm 这样的输入,但它说

could not convert string to float: '5*10**6'.

那么我可以用什么方法来提取更复杂的数字?

时间: 原作者:

85 4

传统上,在 python 中,像许多其他语言一样,指数是用字母 e 或者 e 。 虽然 5 * 10**6 不是有效的浮点文字,5e6 最明显的是。

这是将来要记住的一些事情,但是它不会解决你的in 运算符问题。 问题是 in 只能检查你已经知道的东西是否存在。 如果你的输入是 5e-8 km

你应该开始明确清楚地定义如何确定字符串中数字和单位之间的边界。 例如单位可以是字符串中非数字字符的最后一个连续位。

然后,可以使用 正规表达式 拆分字符串。 因为第一部分可以是任意表达式,所以你可以用像 ast.literal_eval 这样简单的东西来评估它。 你的表达式越复杂,解析器也越复杂。

下面是一个让你入门的示例:

from ast import literal_eval
import re
pattern = re.compile(r'(.*[d.])s*(D+)')
data = '5 * 10**6 mm'
match = pattern.fullmatch(data)
if not match:
 raise ValueError('Invalid Expression')
num, units = match.groups()
num = literal_eval(num)
原作者:
77 4

似乎你正在寻找 eval 函数,如 @Rasgel's 应答所示。 这里是文档。

就像一些人所指出的那样,它带来了巨大的安全风险。

为了避免这个问题,我可以考虑 2种方法:

1.将 eval 与 正规表达式 组合

如果你只想做基本算术运算,比如加法,减法,或者 2**4,你可以用 正规表达式 去除任何非数字运算。

import re
a = str(input("Type in your wavelength:"))
if"mm" in a:
 print("Unit = Millimeter")
# After parsing the units,
# Remove anything other than digits, +, -, *,/,. (floats),! (factorial?) and ()
# If you require any other symbols, add them in
pruned_a = re.sub(r'[^0-9*+-/!.()]',"", a)
result = eval(pruned_a)

确保eval在你的代码中没有实际评估你的本地或者全局变量。

result = eval(expression, {'__builtins__': None}, {})

( 上面的代码来自另一个Stackoverflow答案: 数学表达式评估 --可能还有其他你可能感兴趣的解决方案:

组合

import re
a = str(input("Type in your wavelength:"))
if"mm" in a:
 print("Unit = Millimeter")
# After parsing the units,
# Remove anything other than digits, +, -, *,/,. (floats),! (factorial?) and ()
# If you require any other symbols, add them in
pruned_a = re.sub(r'[^0-9*+-/!.()]',"", a)
result = eval(pruned_a, {'__builtins__': None}, {}) #to be extra safe :)
...