gpt4 book ai didi

python - 使用 Python 解析基于 block 的程序输出

转载 作者:行者123 更新时间:2023-11-30 23:57:45 24 4
gpt4 key购买 nike

我正在尝试使用 Python 解析统计程序 ( Mplus ) 的输出。

输出( example here )的格式由 block 、子 block 、列等构成,其中空格和换行符非常重要。取决于例如。选项要求您在此处或此处获取附加(子) block 或列。

使用正则表达式来解决这个问题一直是一个 PITA,并且完全无法维护。我一直在研究解析器作为更强大的解决方案,但是

  1. 有点overwhelmed通过所有可能的工具和方法;
  2. 给人的印象是它们不太适合这种输出。

例如LEPL 有一个叫做 line-aware parsing 的东西,这似乎朝着正确的方向发展(空格、 block ……),但仍然适合解析编程语法,而不是输出。

建议朝哪个方向看,我们将不胜感激。

最佳答案

是的,解析起来很痛苦。然而,您实际上并不需要很多正则表达式。普通的split可能足以将此文档分解为可管理的字符串序列。

这些是很多我称之为“Head-Body”的文本 block 。您有标题、一行“--”,然后是数据。

您想要做的是将“头-体”结构折叠到生成单独字典的生成器函数中。

def get_means_intecepts_thresholds( source_iter ):
"""Precondition: Current line is a "MEANS/INTERCEPTS/THRESHOLDS" line"""
head= source_iter.next().strip().split()
junk= source_iter.next().strip()
assert set( junk ) == set( [' ','-'] )
for line in source_iter:
if len(line.strip()) == 0: continue
if line.strip() == "SLOPES": break
raw_data= line.strip().split()
data = dict( zip( head, map( float, raw_data[1:] ) ) )
yield int(raw_data[0]), data

def get_slopes( source_iter ):
"""Precondition: Current line is a "SLOPES" line"""
head= source_iter.next().strip().split()
junk= source_iter.next().strip()
assert set( junk ) == set( [' ','-'] )
for line in source_iter:
if len(line.strip()) == 0: continue
if line.strip() == "SLOPES": break
raw_data= line.strip().split() )
data = dict( zip( head, map( float, raw_data[1:] ) ) )
yield raw_data[0], data

重点是通过一组操作消耗头部和垃圾。

然后使用一组不同的操作来使用后面的数据行。

由于这些是生成器,因此您可以将它们与其他操作结合起来。

def get_estimated_sample_statistics( source_iter ):
"""Precondition: at the ESTIMATED SAMPLE STATISTICS line"""
for line in source_iter:
if len(line.strip()) == 0: continue
assert line.strip() == "MEANS/INTERCEPTS/THRESHOLDS"
for data in get_means_intercepts_thresholds( source_iter ):
yield data
while True:
if len(line.strip()) == 0: continue
if line.strip() != "SLOPES": break
for data in get_slopes( source_iter ):
yield data

这样的东西可能比正则表达式更好。

关于python - 使用 Python 解析基于 block 的程序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com