REGEX:小组作为一系列数学,介于两者之间



我试图在python中解析,其中包含此格式的信息

aaa    111(zzz)
       222
       333
bbb    555
       111

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

我想获得的是这样的:

匹配1

  • 第1组。'AAA'
  • 第2组。['111','222','333']

匹配2

  • 第1组。'BBB'
  • 第2组。['555','111']

我正在挣扎的是如何使group 2作为数组。尽管我可能以错误的方式走。

有人可以照亮我吗?

这是我目前的尝试。不过,它甚至还没有我尝试实现的目标。

update

我将使用Python,很可能将re用作Regex模块。

您需要匹配将必要部分捕获为两组的块,然后将/从组2分开/提取所需的东西。

^(S+)s+(.*(?:[rn]+ +.*)*)

详细信息

  • ^-线的开始(由于re.M
  • (S+)-组1:一个或多个非Whitespace Chars
  • s+-1或更多Whitespaces
  • (.*(?:[rn]+ +.*)*)-组2:
    • .*-线的其余部分
    • (?:[rn]+ +.*)*-零或更多的出现
      • [rn]+-1或更多的线路断路chars
      • +-一个或多个空间(您可以用[^Srn]*替换它以匹配任何水平空间)
      • .*-线的其余部分

示例代码

import re
s = """aaa    111(zzz)
       222
       333
bbb    555
       111"""
rx= r'^(S+)s+(.*(?:[rn]+ +.*)*)'
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'])]