如何使用for循环从列表中提取数据

时间:2018-03-02 16:00:16

标签: python list text extract

我有一个包含数字数据的列表。数字用点“。”分隔。和空格“”除非它们是负数,在这种情况下,空格“”由负号“ - ”代替。

我一直无法获取所有信息,这些信息应该适合2982x16矩阵,因为数字不是以相同的方式分开。

列表的一部分是这样的:

1. 1.3884e-17. 0.0000e+00. 1.1913e+00. 1.3996e+00.-7.7122e-01.-1.8788e-01.-5.3170e-16. 1.0076e-31. 0.0000e+00. 3.9673e+05.-1.9531e+05.-3.6224e+04.-7.2504e-11. 1.3740e-26. 0.0000e+00

2. 1.3573e-17. 7.3889e-02. 1.3726e+00. 1.6331e+00. 1.2526e+00. 1.5132e+00.-1.3979e-16.-5.3936e-32.-2.9361e-16. 5.9535e+05. 4.9158e+05. 5.6265e+05.-1.9062e-11.-7.3549e-27.-4.0038e-11

到目前为止,我只能用这样的东西提取前两列:

mat[i,1]=ast.literal_eval(line[3+k:13+k].replace(" ",""))

第一部分旨在将文本转换为浮点数,最后一部分旨在消除文本中的空格。在这种情况下,数字'1.3884e-17'和'1.3573e-17'将被放置在我的矩阵的第二列中,但这对以下内容不起作用,当然更改列表的索引。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

s = '1. 1.3884e-17. 0.0000e+00. 1.1913e+00. 1.3996e+00.-7.7122e-01.-1.8788e-01.-5.3170e-16. 1.0076e-31. 0.0000e+00. 3.9673e+05.-1.9531e+05.-3.6224e+04.-7.2504e-11. 1.3740e-26. 0.0000e+00'

数字以.分隔,后跟空格或短划线。使用正则表达式匹配该分隔符并在其上拆分字符串。该模式需要使用前瞻断言来防止消费负号。

>>> import re
>>> pattern = r'[.](?=[ -])'
>>> re.split(pattern, s)
['1', ' 1.3884e-17', ' 0.0000e+00', ' 1.1913e+00', ' 1.3996e+00', '-7.7122e-01', '-1.8788e-01', '-5.3170e-16', ' 1.0076e-31', ' 0.0000e+00', ' 3.9673e+05', '-1.9531e+05', '-3.6224e+04', '-7.2504e-11', ' 1.3740e-26', ' 0.0000e+00']

将每个数字设为浮点数

>>> [float(n) for n in re.split(pattern, s)]
[1.0, 1.3884e-17, 0.0, 1.1913, 1.3996, -0.77122, -0.18788, -5.317e-16, 1.0076e-31, 0.0, 396730.0, -195310.0, -36224.0, -7.2504e-11, 1.374e-26, 0.0]
>>> 

如果不需要每行的第一个数字,请使用切片将其排除:

>>> numbers = re.split(pattern, s)
>>> [float(n) for n in numbers[1:]]
[1.3884e-17, 0.0, 1.1913, 1.3996, -0.77122, -0.18788, -5.317e-16, 1.0076e-31, 0.0, 396730.0, -195310.0, -36224.0, -7.2504e-11, 1.374e-26, 0.0]
>>>

答案 1 :(得分:2)

我会使用re.findall()来匹配每个号码。

此表达式应该有效:-?\d+\.\d+e[+-]\d+

  • -? - 可选减号
  • \d+ - 数字序列,即有效数字的整个部分
  • \. - 文字句号
  • \d+ - 有效数字的小数部分
  • e[+-] - 文字“e”后跟指数的符号
  • \d+ - 指数

#!/usr/bin/env python3

import re
import pprint

string_data = '''1. 1.3884e-17. 0.0000e+00. 1.1913e+00. 1.3996e+00.-7.7122e-01.-1.8788e-01.-5.3170e-16. 1.0076e-31. 0.0000e+00. 3.9673e+05.-1.9531e+05.-3.6224e+04.-7.2504e-11. 1.3740e-26. 0.0000e+00
2. 1.3573e-17. 7.3889e-02. 1.3726e+00. 1.6331e+00. 1.2526e+00. 1.5132e+00.-1.3979e-16.-5.3936e-32.-2.9361e-16. 5.9535e+05. 4.9158e+05. 5.6265e+05.-1.9062e-11.-7.3549e-27.-4.0038e-11
'''
data = [
    [
        float(number) for number in re.findall(r'-?\d+\.\d+e[+-]\d+', line)
    ]
    for line in string_data.splitlines()
]

pprint.pprint(data)