【问题标题】:Regex Extract specific data between specific strings in python正则表达式在python中的特定字符串之间提取特定数据
【发布时间】:2018-09-26 00:46:17
【问题描述】:

在 python 3.6.3 中使用正则表达式我正在尝试提取与特定开始文本和结束文本相关的科学记数法数字。来自以下示例数据:

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_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']

如果我不使用环视功能,我可以像这样轻松获得所有与科学记数法匹配的数字:

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

但只要我添加了一个前瞻功能:

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

除所需集合中的第一个数字外,其他所有数字都下降。我已经尝试过多次迭代,使用正面和负面的前瞻和后视在 debugex 上无济于事。

我的源文件是 50k+ 行,所需的数据集是 10-11k 行。理想情况下,我想在一次读取文件时捕获我的数据集。

如何正确使用前瞻或后瞻功能将我的数据捕获限制为符合格式但仅来自所需“This_Data”集的数字?

感谢任何帮助!

【问题讨论】:

    标签: python regex python-3.x regex-lookarounds


    【解决方案1】:

    您可能会更轻松地一次解析文件,跳过不符合条件的行。看起来每行都以分号结尾,因此您可以使用它来中断解析。

    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
    

    【讨论】:

    • 詹姆斯,感谢您的出色响应时间!这是我在这里的第一个问题,因为我对编码很陌生,我有点担心我没有任何意义。我试了一下你的代码,果然成功了!这绝对让我完成了我的任务,但对于如何用更少的行来完成它,我仍然有些摸不着头脑。感谢您的帮助!
    • 编码的第一条规则是“让它工作”。有很多方法可以用更少的代码行来实现这一点。但在达到限制因素之前,让您的代码启动并运行更为重要。
    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多