2017-09-20 30 views
1

之间我想在Python解析用的信息的文件在此格式正则表达式:组与CR mathches在

aaa 111(zzz) 
     222 
     333 
bbb 555 
     111 

这个阵列是baically为涉及aaa111222333的方式(一种参考表)。请注意0​​是可选的,但现在这并不重要。

我试图得到的是这样的:

1场

  • 组1 'AAA'
  • 组2 '111', '222', '333']

第2场

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

我所挣扎是如何使group 2作为数组。虽然我可能会走错路。

难道有人会在此点亮我吗?

这是我目前的attempt。尽管如此,它甚至与我试图实现的目标并不接近。

更新

我将使用Python和最有可能re为正则表达式模块。

+0

是什么语言?组捕获堆栈仅受.NET和PyPi正则表达式库支持。在其他所有情况下,将捕获“aaa”的块匹配到组1中,将其余的块匹配到组2中,然后使用空格分隔组2。 –

+0

对不起,发布更新。我正在使用Python。 – kazbeel

+0

但是你使用're'还是'regex'模块? –

回答

2

您需要将捕获必要部分的块匹配到两个组中,然后从组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'])] 
+0

我理解正则表达式,但我仍然不明白为什么在'bbb'中为'rx'“停止”。请参阅[DEMO](https://regex101.com/r/rVobRv/2)。 – kazbeel

+0

我正在使用're.M',因此您必须在[regex101.com](https://regex101.com/r/rVobRv/3)启用'm' MULTILINE模式。 –