解析串接的数字

2024-03-28 17:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以提取浮点数,这些浮点数采用不同的未知格式,不使用分隔符连接到一个字符串中,如下所示:

"3.01-1.58e+006-1.58e+006"

我需要为上面的字符串提取以下数字:

3.01 -1.58e+006 -1.58e+006

注:数字的长度/格式是可变的;我们不知道字符串中有多少个数字


Tags: 方法字符串格式数字浮点数分隔符
2条回答

任何时候提取数据时,都要对数据的形式进行假设,然后告诉计算机根据这些假设寻找模式。获得正确的假设与为您选择的假设获得正确的代码一样重要。在这种情况下,您可能会假设每个数字由一个数字后跟一个小数位组成,后跟更多的数字后跟“e”,后跟“+”或“-”,然后后跟更多的数字。如果你知道每一组数字的长度,你就可以根据这些长度进行分割。最可能一致的长度是小数点前的位数;如果数字是科学记数法,那么就只有一个数字。然而,在这个数字之前也可能有一个减号。因此,您可以遍历字符串,并检查是否有:(下一个字符是+或-,当前+3是。)或(当前+2是。);每次发生这种情况,你就会得到另一个号码

number_list = [None]
beginning_of_current_number = 0
for index in range(len(str)-3):
  if (str[index+1] in ["+","-"] & str[index+3] == "."):
    number_list.append(float(str[beginning_of_current_number:index+1]))
    beginning_of_current_number = index+1
  elsif (str[index+2] == "." & beginning_of_current_number != index-1):
    number_list.append(float(str[beginning_of_current_number:index+1]))
    beginning_of_current_number = index+1
#the above won't get the last number, so 
number_list.append(float(str[beginning_of_current_number:-1]))

这个正则表达式并不漂亮,但它似乎适用于您的示例:

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

Debuggex Demo

意思是:字符串或符号的开头,后跟数字和点,可能后跟e,后跟符号和数字

>>> import re
>>> re.findall("((?:^|[\+\-])[\d\.]+(?:e[\+\-]\d+)?)","3.01-1.58e+006-1.58e+006")
['3.01', '-1.58e+006', '-1.58e+006']

相关问题 更多 >