正则表达式在python中提取特定字符串之间的特定数据

2024-04-25 07:24:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3.6.3中使用regex,我试图提取与特定开始文本和结束文本相关联的科学符号数字。根据以下样本数据:

Not_the_data : REAL[10] (randomtext := doesntapply) := [1.00000000e+000,-2.00000000e000,3.00000000e+000,4.00000000e+000,5.00000000e+000,6.00000000e+000
            ,7.00000000e+000,8.00000000e-000,9.00000000e+000,1.00000000e+001,1.10000000e+001];

This_data : REAL[2,27] (RADIX := Float) := [3.45982254e-001,9.80374157e-001,8.29904616e-001,1.57800000e+002,4.48320538e-001,6.20533180e+001
            ,1.80081348e+003,-8.93283653e+000,5.25826037e-001,2.16974407e-001,1.17304848e+002,6.82604387e-002
            ,3.76116596e-002,6.82604387e-002,3.76116596e-002];

Not_it_either : REAL[72] (randomtext := doesntapply) := [0.00000000e+000,-0.00000000e000,0.00000000e+000,0.00000000e+000,0.00000000e+000,0.00000000e+000];

我只需要“This\u data”集合中的数据:

['3.45982254e-001','9.80374157e-001','8.29904616e001','1.57800000e+002','4.48320538e-001','6.20533180e+001','1.80081348e+003','-8.93283653e+000','5.25826037e-001','2.16974407e-001','1.17304848e+002','6.82604387e-002','3.76116596e-002','6.82604387e-002','3.76116596e-002']

如果我不使用lookaround函数,我可以很容易地得到与科学符号匹配的所有数字,如下所示:

values = re.findall('(-?[0-9]+.[0-9]+e[+-][0-9]+)',_DATA_,re.DOTALL|re.MULTILINE)

但只要我添加了一个lookahead函数:

values = re.findall('(?<=This_data).*?(-?[0-9]+.[0-9]+e[+-][0-9]+)+',_DATA_,re.DOTALL|re.MULTILINE)

除所需集合中的第一个数字外,其他所有数字都会下降。我尝试了多次在debugex上使用正向和反向的lookahead和lookback进行迭代,但都没有效果。你知道吗

我的源文件是50k+行,所需的数据集是10-11k行。理想情况下,我想捕获我的数据集在我的文件一读通过。你知道吗

如何正确使用lookahead或lookback函数将数据捕获限制为符合格式但仅来自所需的“This\u data”集合的数字?你知道吗

感谢您的帮助!你知道吗


Tags: 数据函数文本redata符号not数字
1条回答
网友
1楼 · 发布于 2024-04-25 07:24:05

一次只解析一行文件可能会更容易,跳过不符合条件的行。看起来每一行都以分号结尾,因此可以使用它来中断解析。你知道吗

import re

PARSING = False
out = []

with open('path/to/file.data') as fp:
    for line in fp:
        if line.startswith('This_data'):
            PARSING = True
        if PARSING:
            out.append(re.findall('(-?[0-9]+.[0-9]+e[+-][0-9]+)', line)
        # check if the line contains a semicolon to stop parsing
        if ';' in line:
            PARSING = False

# return the results:
out

相关问题 更多 >