首页 > 解决方案 > 正则表达式返回第一个和最后一个匹配,而不是在匹配括号之间返回第一个和第二个匹配

问题描述

我正在尝试解析文本以提取所需的字符串。我在 中遗漏了一些东西regex,有人可以帮我弄清楚这里有什么问题吗?

这是我的脚本:

import re
a = """
    block1
          #(/*AUTOINSTPARAM*/
        // Parameters
        .THREE          (3),     // comment
        .TWO            (2), // comment
        .ONE    (1))             // comment
        inst1
           (/*AUTOINST*/
        // extra
        // output

    block2
          #(/*AUTOINSTPARAM*/
        // Parameters
        .THREE          (3),     // comment
        .TWO            (2), // comment
        .ONE    (1))             // comment
        inst2
           (/*AUTOINST*/
        // extra
        // output
"""

op = re.findall(r'(\w+)\s*(#\(.*\))?.*?(\w+)\s*\(', a, re.MULTILINE|re.DOTALL)
for i in op:
    print(i[0],i[2])

这是输出:

('block1', 'inst2')

预期输出:

('block1', 'inst1')
('block2', 'inst2')

更新:尝试测试与接受的答案相同的正则表达式的以下输入:

import re
a = """
    except_check
          #(
            .a        (m),
            .b        (w),
            .c        (x),
            .d        (1),
            .e        (1)
        )
        data_check
           (// Outputs

  abc
  #(
    .a                          (b::c)
   )
   mask
   (/*AUTOINST*/

"""

op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[#/.].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
for i in op:
    print(i)

它没有返回任何东西。它应该返回以下内容:

('except_check', 'data_check')
('abc', 'mask')

标签: pythonpython-3.xregexpython-2.7

解决方案


请您尝试以下方法:

#op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[#/.].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
op = re.findall(r'^\s*(\w+)\s*$\n(?:^\s*[^\w\s].*$\n)*^\s*(\w+)\s*\(', a, re.MULTILINE)
for i in op:
    print(i)

输出:

('block1', 'inst1')
('block2', 'inst2')
  • ^\s*(\w+)\s*$\n匹配块名行
  • (?:^\s*[^\w\s].*$\n)*匹配参数行
  • ^\s*(\w+)\s*\(匹配实例名称行

请注意,我已禁用该re.DOTALL选项(尽管解决此问题很简单)。


推荐阅读