我有一个包含数字数据的列表。数字用点“。”分隔。和空格“”除非它们是负数,在这种情况下,空格“”由负号“ - ”代替。
我一直无法获取所有信息,这些信息应该适合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'将被放置在我的矩阵的第二列中,但这对以下内容不起作用,当然更改列表的索引。
任何帮助都将不胜感激。
答案 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)