基于多个分隔符拆分字符串不会产生一致的结果

时间:2018-02-11 14:25:48

标签: python regex string

我有一个包含许多行的文件类型,其中包含以下信息:

  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([ = ( ]|,),但这些内容也无效。我也不是一个大的正则表达式用户(虽然我知道它们非常强大),这解释了为什么我很难找到合适的用户。

我想我需要按' = ( '','分隔这些行,但我真的不知道怎么做才能使结果列表保持一致。任何帮助将非常感激。

由于

6 个答案:

答案 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]*

详细说明:

  • []匹配列表中的单个字符
  • + oneunlimited次之间的匹配
  • * zerounlimited次之间的匹配

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]