【问题标题】:Split output data text file where paragraphs and tables are mixed拆分混合了段落和表格的输出数据文本文件
【发布时间】:2020-01-12 19:34:36
【问题描述】:

我有许多来自软件程序的输出文本文件,它们将部分标题、描述和表格混合在同一个文件中。我需要找到一种可靠地提取数据的方法。该文件大致如下所示:

section title, a=1
description, description, description

x,y,z,p
(m),(m),(m),(psi)
0,0,0
0,0,1
...

section title, a=2
description, description, description

a,k,r
(ft),(mm),(f)
4,4,1
0,0,1

section title, a=3
description, description, description
...

到目前为止,我的方法是将所有内容读入字符串:

with open(file) as f:
    raw_data = f.read().strip()

然后使用re 库,例如:

re.split(r"section title,\s+a=\d+", raw_data)

问题是,a 的值充当分隔符并消失,而我实际上想保留它而不是在它之前拆分。

我知道如果我将它分组为re.split(r"section title,\s+a=\d+", raw_data),我可以“保留”它,但是我有一个不匹配的数据列表,其中每个其他项目都是一个小数字,并且表数据都是穿插的,这并不理想,即:

['1', '<long string with table>', '2', '<another long string>', '3', ...]

理想情况下,输出将是我可以将 a 值作为键并将表数据作为其值的东西。我可以用我正在使用的技术来管理它,但这似乎是错误的方法。

我不确定处理此类事情的正常方法是什么,所以我正在寻找其他选择和更优雅的解决方案。

【问题讨论】:

  • 不包括拆分中的号码section title,\s+a= 怎么样?
  • 另一种方法是不使用拆分,只是一个正常的查找类型的东西section title, a=(\d+)\s*((?:(?!section title, a=)[\S\s])*?)\s*
  • @sln:第一个建议是真的,谢谢。但是,假设我需要保留整个标题及其包含的信息,我将如何解决这是我希望弄清楚的事情
  • @sln ?! 可能是我正在寻找的答案;我从来没有使用过负前瞻匹配;看起来很有趣。感谢您的帮助。
  • 停止匹配,将字符串分成部分标题

标签: python regex parsing text split


【解决方案1】:

如果想在拆分时保持数量,只需要使用捕获组即可。

如果在模式中使用捕获括号,则模式中所有组的文本也会作为结果列表的一部分返回。

re.split's docs

使用你的初始方法和re.split,你会得到:

['', '1', '\ndescription, description, description\n\nx,y,z,p\n(m),(m),(m),(psi)\n0,0,0\n0,0,1\n...\n\n', '2', '\ndescription, description, description\n\na,k,r\n(ft),(mm),(f)\n4,4,1\n0,0,1\n\n', '3', '\ndescription, description, description', ... ]

这样你就可以有一个函数来解析数据,如下所示:

def parse_data(raw_data):
    parts = re.split(r'section title,\s+a=(\d+)', raw_data)
    return {key: table for key, table in zip(parts[1::2], parts[2::2])}

产生结果:

{'1': '\ndescription, description, description\n\nx,y,z,p\n(m),(m),(m),(psi)\n0,0,0\n0,0,1\n...\n\n',
 '2': '\ndescription, description, description\n\na,k,r\n(ft),(mm),(f)\n4,4,1\n0,0,1\n\n',
 '3': '\ndescription, description, description'}

请注意,用于此的适当技术取决于文件的格式以及您可以假设的任何保证。

ps:我不确定您是否要保留description, description, description 这一行,以及新行如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2021-01-17
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多