我有一个包含许多行的文件类型,其中包含以下信息:
P087 = ( 4.000000000000000E+001,-6.250000000000000E-001 )
P088 = ( 4.000000000000000E+001, 0.000000000000000E+000 )
我正在使用
逐行阅读此文件fo = open(FileName, 'r')
for line in fo:
#do stuff to line
我想看看如何拆分每一行以提供如下列表:
[87, 40.0,-0.625]
[88, 40.0, 0.0]
我尝试使用python
常规.split()
方法进行拆分,但它并不是一致地拆分行,而是为每一行产生不同的列表长度。
我还使用re.split()
之类的内容调查了re.split([ = ( ]|,)
,但这些内容也无效。我也不是一个大的正则表达式用户(虽然我知道它们非常强大),这解释了为什么我很难找到合适的用户。
我想我需要按' = ( '
和','
分隔这些行,但我真的不知道怎么做才能使结果列表保持一致。任何帮助将非常感激。
由于
答案 0 :(得分:4)
使用ast.literal_eval()
解析元组字符串:
import ast
import re
with open(FileName, 'r') as f:
out = [
[int(re.findall('(?<=P)\d+', k)[0]), *ast.literal_eval(v.strip())]
for k, v in [line.split('=') for line in f]
]
答案 1 :(得分:2)
这应该这样做:
for line in fo:
parts = re.match(r'\s*P(\d+)\s*=\s*[(]\s*([^ ,]*)[ ,]+([^ ,]*)[ )]*',line).groups()
print([int(parts[0]), float(parts[1]), float(parts[2])])
re.match
用于提取重要部分,然后将每个部分解析为适合打印的类型。
答案 2 :(得分:2)
没有正则表达式的解决方案:
def parse_line(line):
first, second = line.split(',')
ind = int(first.split()[0][2:])
num1 = float(first.split()[-1])
num2 = float(second.split()[0])
return [ind, num1, num2]
line = 'P087 = ( 4.000000000000000E+001,-6.250000000000000E-001 )'
print(parse_line(line))
line = ' P088 = ( 4.000000000000000E+001, 0.000000000000000E+000 )'
print(parse_line(line))
答案 3 :(得分:1)
以下正则表达式将从文件中提取所有行:
c = re.compile(r'\s*P(\d+)\s*=\s*\(\s*([\d\.\+\-E]+)\s*,\s*([\d\.\+\-E]+)\s*\)')
lines = list(c.findall(x))
其中x
是您的文件内容的字符串。
答案 4 :(得分:1)
使用它并不总是一个好主意,但在这些情况下eval
可能是理想的:
from ast import literal_eval
result = []
for line in fo:
item = []
name, val = line.split('=')
item.append(name.strip())
item.extend(literal_eval(val.strip()))
result.append(item)
print(result)
答案 5 :(得分:0)
正则表达式:[-0-9.]+[-E+0-9]*
或[-\d.]+[-E+\d]*
详细说明:
[]
匹配列表中的单个字符+
one
和unlimited
次之间的匹配*
zero
和unlimited
次之间的匹配Python代码:
import re
def arr_num(text):
array = []
for n in re.finditer(r'[-0-9.]+[-E+0-9]*', text):
array.append(n.group().isdigit() and int(n.group()) or float(n.group()))
return array
输出:
arr_num("SE104 = ( P1555, P1378, P1379, P1380, P1377, P1363, P1362, P1361, P1367, P1371, P1372, P1373, P1364, P1365, P1366 )")
>>> [104, 1555, 1378, 1379, 1380, 1377, 1363, 1362, 1361, 1367, 1371, 1372, 1373, 1364, 1365, 1366]
arr_num("P087 = ( 4.000000000000000E+001,-6.250000000000000E-001 )")
>>> [87, 40.0, -0.625]