解析一串串联数字

时间:2017-10-06 19:27:05

标签: python parsing

有没有办法提取浮点数,这些浮点数是不同的和未知的格式,并且没有分隔符连接成这样的字符串:

  

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

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

  

3.01   -1.58e + 006   -1.58e + 006

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

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

每当您提取数据时,您就会对数据的形式做出假设,然后告诉计算机根据这些假设寻找模式。获得正确的假设与为您选择的假设获得正确的代码一样重要。在这种情况下,您可能做出的一个假设是每个数字由一个数字后跟一个小数位组成,后跟一些数字后跟" e",然后是" +&#34 ;或" - ",然后是更多数字。如果您知道每组数字的长度,您可以分割这些长度。最可能一致的长度是小数位前的位数;如果数字是科学记数法,那么只有一位数字。但是,在该数字之前可能还有一个减号。所以你可以通过字符串,检查你是否:(下一个字符是+或 - ,当前+ 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]))