解析以字符串

时间:2017-11-11 22:32:42

标签: python python-3.x

我有一些数据,我想读入一个numpy数组。数据采用字符串格式。一行的格式为

' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00'

我想将字符串分解为五个单独的数字。如果所有数字之间有空格,这很简单。不幸的是,在数字为负数的情况下更难,因为负数和前面的数字之间没有空格。减号不仅出现在负数前面。有时,指数为负数,如上面第一个数字所示。有没有快速的方法将上面的行解析为五个单独的数字?

这是我目前拥有的代码的MWE

import pandas as pd
data1 = pd.read_csv('datafile.csv')
dim1 = 5
geometryparameters = np.zeros(dim1,dtype=float)

c=data1.iloc[1,0] # Just taking the first row, which is in string format
csplit = c.split(" ") # Splitting the string into parts
for it1 in np.arange(dim1):
    geometryparameters[it1] = float(csplit[it1]) # converting the string into float

由于上面提到的减号问题,上述代码在某些情况下失败。

2 个答案:

答案 0 :(得分:3)

如果您无法修改输入,因为数字始终以E+/-xx结尾,您可以在遇到此模式时使用正则表达式插入空格(使用正则表达式),然后拆分&转换为浮动:

import re

s = ' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00'

result = [float(x) for x in re.sub("(E[+\-]\d\d)",r"\1 ",s).split()]

print(result)

(使用捕获搜索E<sign> and 2 digits并替换相同的内容(\1)加空格。

收率:

[0.00600759893, 0.0, -0.0011232585, 0.0, 0.0]

编辑:只使用正则表达式findall更快,没有str.split

result = [float(x) for x in re.findall(r"\b.*?E[+\-]\d\d",s)]

寻找一个单词(注意左边的单词边界,非贪婪或者它将匹配多于1个数字),以及右边的指数表达式。

答案 1 :(得分:2)

根据您的信息,每个数字字段长度恰好为16个字符。因此每行长度为80个字符。

因此,对于每一行,x将是5个数字的列表:

x = [float(line[n:n+16]) for n in range(0,80,16)]
相关问题