【问题标题】:Extract Positive and Negative float values in raw text file using Python使用 Python 在原始文本文件中提取正负浮点值
【发布时间】:2020-03-20 07:19:16
【问题描述】:

所以我试图从这样的原始文本文件中提取某些值

Number of zero columns: 4
Memory requirement - global matrix: 1571340 solver (totally): 1571340
P1127_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.04055  0.0015347 
P2243_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.04055  0.0017193 
P3387_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.04055  0.0015347 
% of load in interval  Step:    59  Iteration:     2  Time:    0.04055  0.0400000  0.0400000 
summation % of load in interval  Step:    59  Iteration:     2  Time:    0.04055  0.0800000 

Number of zero columns: 4
Memory requirement - global matrix: 1571340 solver (totally): 1571340
P1127_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.01638 -0.0016876 
P2243_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.01638 -0.0018896 
P3387_VELOCITIES #001000  Step:    59  Iteration:     2  Time:    0.01638 -0.0016876 
% of load in interval  Step:    59  Iteration:     2  Time:    0.01638  0.0400000  0.0400000 
summation % of load in interval  Step:    59  Iteration:     2  Time:    0.01638  0.0800000 

所以我想用这段代码提取P1127_VELOCITIES

P1127_positive = re.compile(r'P1127_VELOCITIES #001000  Step:    (\d+)  Iteration:     (\d+)  Time:    (\d+\.\d+)  (\d*\.\d+|-\d*\.\d+)')

P1127_negative = re.compile(r'P1125_VELOCITIES #001000  Step:    (\d+)  Iteration:     (\d+)  Time:    (\d+\.\d+) (\d*\.\d+|-\d*\.\d+)')


def Extract_Data(filepath, expression_positive, expression_negative, data):

    velocity_list = []
    time_list = []
    #negative_data = []

    with open(filepath) as file:
        for line in file:
            data.extend(expression_positive.findall(line))

    with open(filepath) as file:
        for line in file:
            data.extend(expression_negative.findall(line))
    print(data[0])
    print(data[1])
    for data_tuple in data:
        step, iteration, time, velocity = data_tuple
        velocity_list.append(float(velocity))
        time_list.append(float(time))



    return velocity_list, time_list

但是,我想在右端提取所有浮点值,而不是分别提取正负值。正如您在文本文件中看到的,正值有 2 个空格(即Time: 0.04055[space][space]0.0015347,而负值只有 1 个空格(即Time: 0.01638[space]-0.0016876

有没有办法使用 re.compile 来提取这两个值? (就像我上面的一样,但都提取了)。你会推荐什么表达方式? (即([-+]?\d\.\d+)

干杯!

【问题讨论】:

  • 只做re.findall(r"(?m)P112[57].*\s(-?\d\S+)\s*$",file.read())
  • 嗨 ggorlen,我想从一些文本文件中提取速度(P1127、P2243 等),并且我想从中提取所有值。我要提取的一行示例是:P1127_VELOCITIES #001000 Step: 59 Iteration: 2 Time: 0.02419 -0.0010204
  • @Tan Phan 您面临的具体问题是什么?哪条线是速度?哪个是时间?为什么你需要不同的消极和积极?您不能将它们都提取到一个列表中吗?

标签: regex python-3.x dataframe text-extraction data-extraction


【解决方案1】:

提供的代码中的正则表达式对于您提供的文件来说似乎是多余的。我看不出有什么理由让他们如此死板,以至于改变一个角色需要一种新的模式。文件中似乎没有足够的微小变化来非常具体地说明一行中的空格数和格式。

这个 sn-p 在您共享的文件上干净利落地完成这项工作(我使用 append 而不是 extend 以便保留每一行的时间对)。根据需要添加更多要求以更具体地匹配行很简单(例如,如果您希望指定步骤或迭代)。如果您想将其放入函数中并使用它按不同的速度值进行过滤,您还可以动态构建正则表达式模式。

import re

pattern = r"P1127_VELOCITIES.+?Time:\s*(\S+)\s+(\S+)\s*$" 
data = []

with open("file.txt") as f:
    for line in f:
        m = re.match(pattern, line)

        if m: 
            data.append(tuple(map(float, m.groups())))

print(data)

输出:

[(0.04055, 0.0015347), (0.01638, -0.0016876)]

【讨论】:

  • 没问题,很高兴它成功了。我担心这个文件有很多你试图避免的边缘情况,但如果它的格式很好,那么我们可以在空格和非空格上进行简单的匹配。
【解决方案2】:

你现在在做什么:

您使用以下方法匹配正值:

(\d+\.\d+) (\d*\.\d+|-\d*\.\d+)')(组间2个空格)

您使用以下方法匹配负值:

(\d+\.\d+) (\d*\.\d+|-\d*\.\d+)')(组之间有一个空格)

您可以使用 [space]{1,2} 匹配 1 或 2 个空格。

像这样:

(\d+\.\d+) {1,2}(\d*\.\d+|-\d*\.\d+)

您可以在这里进行现场测试:https://regex101.com/r/Cz1YJ2/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多