代码之家  ›  专栏  ›  技术社区  ›  kazbeel

正则表达式:将组作为介于CR之间的Mathche数组

  •  1
  • kazbeel  · 技术社区  · 7 年前

    aaa    111(zzz)
           222
           333
    bbb    555
           111
    

    这实际上是一种联系方式 aaa 具有 111 222 333 (一种参考表)。请注意 zzz 是可选的,尽管这现在并不重要。

    我想要得到的是这样的东西:

    匹配1

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

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

    我正在努力解决的是如何 group 2 作为数组。尽管我可能走错了路。

    有人能告诉我这个吗?

    attempt . 尽管如此,这与我试图实现的目标还相差甚远。

    使现代化

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    您需要将捕捉必要部分的块匹配为两组,然后从组2中分割/提取您需要的部分。

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

    细节

    • ^ -线路起点(由于 re.M
    • (\S+) -组1:一个或多个非空白字符
    • \s+ -1个或多个空格
    • (.*(?:[\r\n]+ +.*)*)
      • .* -线路的其余部分
      • (?:[\r\n]+ +.*)* -零次或多次出现
        • [\r\n]+
        • + -一个或多个空格(您可以将其替换为 [^\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'])]