擅长:python、mysql、java
<p>你的正则表达式与任何内容都不匹配,因为它是没有。不正确使用多行标志<code>.*</code>将不匹配新行字符,因此可以使用<code>[\s\S]*</code>:</p>
<pre><code>r'package ([^\s]+)\s+is([\s\S]*)end\s+(package|\1)\s*;'
</code></pre>
<p>参见演示<a href="https://regex101.com/r/tZ3uH0/1" rel="nofollow">https://regex101.com/r/tZ3uH0/1</a></p>
<p>但是这里还有另外一个问题,字符串包含2个package块,这一点是,作为一种更优雅和高效的方法,您可以使用<code>re.DOTALL</code>标志,使“.”特殊字符与任何字符匹配,包括新线。所以您可以编写如下正则表达式:</p>
^{pr2}$
<p>但这仍将匹配第一个区块:</p>
<pre><code>>>> 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
</code></pre>
<p>对于匹配所有块,您需要澄清第二组中的单词<code>body</code>:</p>
<pre><code>package\s+(?:\w+\s+?)?([^\s]+)\s+is(.*?)end\s+(package|\1)\s*;
</code></pre>
<p>参见演示<a href="https://regex101.com/r/tZ3uH0/3" rel="nofollow">https://regex101.com/r/tZ3uH0/3</a></p>