我想编写一个单位转换器,我需要从输入字符串的单位中提取给定值。
为了在使用转换器时提供用户友好的体验,我希望用户能够在同一个字符串中输入值和单位。我的问题是我想提取数字和字母,以便我可以告诉程序单位和值并将它们存储在两个不同的变量中。为了提取字母,我使用了 in 运算符,它工作正常。我还找到了从输入中获取数字的解决方案,但这不适用于具有指数的值。
a = str(input("Type in your wavelength: "))
if "mm" in a:
print("Unit = Millimeter")
b = float(a.split()[0])
将像 567 mm 这样的简单输入作为 float 存储在 b 中是可行的,但我希望能够提取像 5*10**6 mm< 这样的输入 但它说
could not convert string to float: '5*10**6'.
那么我可以使用什么来将像这样的更复杂的数字提取到 float 中呢?
请您参考如下方法:
传统上,与许多其他语言一样,在 Python 中,指数以字母 e 或 E 为前缀。虽然 5 * 10**6 不是有效的浮点文字,但 5e6 绝对是。
这是 future 要牢记的事情,但它不会解决您使用 in 运算符的问题。问题在于 in 只能检查您已知的内容是否存在。如果您的输入是 5e-8 km 会怎样?
您应该首先明确定义如何识别字符串中数字和单位之间的边界。例如,单位可能是字符串中非数字字符的最后一个连续位。
然后您可以使用 regular expressions 拆分字符串.因为第一部分可以是任意表达式,所以你可以用像 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)
