正则表达式:分组为匹配数组,中间有 CR

Regex: group as an array of mathches with CR in between

我正在尝试在 Python 中解析包含此格式信息的文件

aaa    111(zzz)
       222
       333
bbb    555
       111

这基本上是一种将 aaa111222333 联系起来的方式(一种参考 table)。请注意,zzz 是可选的,尽管现在这并不重要。

我想得到的是这样的:

匹配 1

匹配 2

我正在苦苦挣扎的是如何将 group 2 作为一个数组。虽然我可能走错了路。

有人可以照亮我吗?

这是我现在的 attempt。不过,它甚至与我试图实现的目标相去甚远。

更新

我将使用 Python 并且很可能 re 作为正则表达式模块。

您需要将捕获必要部分的块匹配到两组中,然后split/extract从第 2 组中选择您需要的部分。

^(\S+)\s+(.*(?:[\r\n]+ +.*)*)

详情

  • ^ - 行首(由于 re.M
  • (\S+) - 第 1 组:一个或多个非空白字符
  • \s+ - 1 个或多个空格
  • (.*(?:[\r\n]+ +.*)*) - 第 2 组:
    • .* - 该行的其余部分
    • (?:[\r\n]+ +.*)* - 零次或多次出现
      • [\r\n]+ - 1 个或多个换行字符
      • + - 一个或多个空格(您可以将其替换为 [^\S\r\n]* 以匹配任何水平空格)
      • .* - 该行的其余部分

一个example code

import re
s = """aaa    111(zzz)
       222
       333
bbb    555
       111"""
rx= r'^(\S+)\s+(.*(?:[\r\n]+ +.*)*)'
res =[]
for m in re.finditer(rx, s, re.M):
    res.append((m.group(1), re.findall(r"[0-9]+", m.group(2))))
    # res.append((m.group(1), m.group(2).split())) # or split with whitespace
print(res) # => [('aaa', ['111', '222', '333']), ('bbb', ['555', '111'])]