python反向引用正则表达式

2024-09-19 14:23:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要像这样搜索:

lines = """package p_dio_bfm is
   procedure setBFMCmd (  
      variable  pin : in tBFMCmd
      );
end p_dio_bfm; -- end package;

package body p_dio_bfm is
   procedure setBFMCmd (  
      variable  pin : in tBFMCmd
      ) is
   begin
      bfm_cmd := pin;
   end setBFMCmd;
end p_dio_bfm;"""

我需要提取包名,即p_dio_bfm和包声明,即“package p_dio_bfm is”和第一个“end p_dio_bfm”之间的部分

问题是包声明可能以“end p_dio_bfm;”或“end package;”结尾,因此我尝试了以下“或”regex,其中: -适用于以“结束包”结尾的包 -不适用于以“end pck_name;”结尾的包

^{pr2}$

问题是regex的(package |\1)部分,在这里我要捕捉单词“package”或匹配的包名称。在

更新:我已经提供了一个完整的代码,我希望能澄清它:

^{3}$

我希望在这两种情况下,使用一个唯一的regex,来取回这个部分:

"""procedure setBFMCmd (
          variable  pin : in tBFMCmd
          );"""  

没有我删除的\n字符。在


Tags: in声明packageis结尾pinvariableregex
2条回答

你的正则表达式与任何内容都不匹配,因为它是没有。不正确使用多行标志.*将不匹配新行字符,因此可以使用[\s\S]*

r'package ([^\s]+)\s+is([\s\S]*)end\s+(package|\1)\s*;'

参见演示https://regex101.com/r/tZ3uH0/1

但是这里还有另外一个问题,字符串包含2个package块,这一点是,作为一种更优雅和高效的方法,您可以使用re.DOTALL标志,使“.”特殊字符与任何字符匹配,包括新线。所以您可以编写如下正则表达式:

^{pr2}$

但这仍将匹配第一个区块:

>>> match = pattern.search(lines)
>>> print match.group(0)
package p_dio_bfm is
   procedure setBFMCmd (  
      variable  pin : in tBFMCmd
      );
end p_dio_bfm;   end package;
>>> print match.group(1)
p_dio_bfm
>>> print match.group(2)

   procedure setBFMCmd (  
      variable  pin : in tBFMCmd
      );
end p_dio_bfm;   
>>> print match.group(3)
package

对于匹配所有块,您需要澄清第二组中的单词body

package\s+(?:\w+\s+?)?([^\s]+)\s+is(.*?)end\s+(package|\1)\s*;

参见演示https://regex101.com/r/tZ3uH0/3

怎么样:

>>> for row in re.findall(
...   r'package(?:\s.*?)(?P<needle>[^\s]+)\s+is\s+(.*?)end\s+(?:package|(?P=needle));',
...   lines,
...   re.S
... ):
...   print '{{{', row[1], '}}}'
...
{{{ procedure setBFMCmd (
      variable  pin : in tBFMCmd
      );
}}}
{{{ procedure setBFMCmd (
      variable  pin : in tBFMCmd
      ) is
   begin
      bfm_cmd := pin;
   end setBFMCmd;
}}}

我冒昧地不去过滤@mihai hangiu是怎么问的,包括第二个块。在

相关问题 更多 >