在 Python 中,如何将以空格分隔的日志输出转换为 Markdown 格式的 table?

In Python, how could I convert a whitespace-delimited log output to a Markdown-formatted table?

在 Python 中,如何将以空格分隔的日志输出转换为 Markdown 格式的 table?

我有一个输出日志,其中包含以下形式的打印输出:

 - e_jets cutflow:
                                  cut         events
      1                       INITIAL          13598
      2                           GRL           7250
      3               EL_N 25000 >= 1            326
      4               EL_N 25000 == 1            313
      5               MU_N 25000 == 0            313
      6             JETCLEAN LooseBad            313
      7              JET_N 25000 >= 1            113
      8              JET_N 25000 >= 2             26
      9              JET_N 25000 >= 3              8
     10              JET_N 25000 >= 4              2
     11      MVA_BTAG MV2c20 -0.4434               2
     12                     VARIABLES              2
     13                          SAVE              2

 - mu_jets cutflow:
                                  cut         events
      1                       INITIAL          13598
      2                           GRL           7250
      3               MU_N 25000 >= 1            326
      4               MU_N 25000 == 1            313
      5               EL_N 25000 == 0            313
      6             JETCLEAN LooseBad            313
      7              JET_N 25000 >= 1            127
      8              JET_N 25000 >= 2             47
      9              JET_N 25000 >= 3             15
     10              JET_N 25000 >= 4              4
     11      MVA_BTAG MV2c20 -0.4434               4
     12                     VARIABLES              4
     13                          SAVE              4

我想将其转换为如下形式 (Markdown tables):

|**e_jets cutflow**|**cut**|**events**|
|---|---|---|
|1|INITIAL|13598|
|2|GRL|7250|
|3|EL_N 25000 >= 1|326|
|4|EL_N 25000 == 1|313|
|5|MU_N 25000 == 0|313|
|6|JETCLEAN LooseBad|313|
|7|JET_N 25000 >= 1|113|
|8|JET_N 25000 >= 2|26|
|9|JET_N 25000 >= 3|8|
|10|JET_N 25000 >= 4|2|
|11|MVA_BTAG MV2c20 -0.4434|2|
|12|VARIABLES|2|
|13|SAVE|2|

|**mu_jets cutflow**|**cut**|**events**|
|---|---|---|
|1|INITIAL|13598|
|2|GRL|7250|
|3|MU_N 25000 >= 1|326|
|4|MU_N 25000 == 1|313|
|5|EL_N 25000 == 0|313|
|6|JETCLEAN LooseBad|313|
|7|JET_N 25000 >= 1|127|
|8|JET_N 25000 >= 2|47|
|9|JET_N 25000 >= 3|15|
|10|JET_N 25000 >= 4|4|
|11|MVA_BTAG MV2c20 -0.4434|4|
|12|VARIABLES|4|
|13|SAVE|4|

一种方法是用竖线字符替换两个或多个连续的空格。我怎样才能有效地做到这一点?鉴于 table 总是有三列,是否有更好、更稳健的方法来做到这一点?

根据完全按照发布的问题、评论和样本数据(所有空格,没有制表符),我的假设是真正的问题是如何处理数据中的每一行都包含不同的每个字段之间的空格数。

假设空格可以出现在一个字段中,但一次只能出现一个,并且两个或多个空格分隔一个字段,以下正则表达式可以轻松找到每个字段(两个或更多空格)之间的分隔符:

[ ]{2,}

然后使用替换来替换所有分隔符:

output = re.sub(r'[ ]{2,}', input, '|')

当然,这不处理行尾或标题。但是对于标题,您可能还是希望按行拆分,因此您也可以处理行尾:

SPACES_RE = re.compile(r'[ ]{2,}')

new_lines  []
for line in input.split('\n'):
    new_lines.append(SPACES_RE.sub(line, '|'))
output = '|\n'.join(new_lines)

现在,只需在循环中添加一两个 if 语句来检测标题并适当地格式化它,您就有了一个可行的解决方案。由于没有具体询问,我将把它留作 reader.

的练习