Python 正则表达式多行不处理重复模式

Python 正则表达式多行不处理重复模式,python,regex,Python,Regex,我试图得到一个正则表达式来匹配具有多行的多个模式,但它始终匹配所有模式。例如,我想匹配两次此代码: STDMETHOD(MyFunc)( D2D1_SIZE_U size, _In_opt_ CONST void *srcData, ) PURE; STDMETHOD(MyFunc2)( _In_opt_ CONST void *srcData2, UINT32 pitch2, ) PURE; 我点击了这个链接: 并提出了这个模式: \bSTDMETHOD\b((.|\n|\r)*)\b

我试图得到一个正则表达式来匹配具有多行的多个模式,但它始终匹配所有模式。例如,我想匹配两次此代码:

STDMETHOD(MyFunc)(
D2D1_SIZE_U size,
_In_opt_ CONST void *srcData,
) PURE;

STDMETHOD(MyFunc2)(
_In_opt_ CONST void *srcData2,
UINT32 pitch2, 
) PURE;
我点击了这个链接:

并提出了这个模式:

\bSTDMETHOD\b((.|\n|\r)*)\bPURE\b
但是,它不起作用。
((.|\n |\r)*)
匹配整个内容。我希望它在发现“纯净”时停止。换句话说,一个合适的匹配会给我上面代码的两个匹配项,但是我的表达式只在最后一个“纯”关键字处停止,只进行一个匹配项

如果您看到它不起作用的原因,请告诉我。

您应该使用,因为他们在找到第一个匹配项时停止:

\bSTDMETHOD\b((.|\n|\r)*?)\bPURE\b
在Regexr.com上测试

使用
*?
(带有非贪婪修饰符的点
)并添加
s
g
标志,而不是
(.\n\r)*

/\bSTDMETHOD\b(.*?)\bPURE\b/sg
s
标志意味着
匹配
\r
\n
,而
g
标志允许您捕获主题文本中的所有匹配字符串

在Python中,请尝试:

txt='''\
STDMETHOD(MyFunc)(
D2D1_SIZE_U size,
_In_opt_ CONST void *srcData,
) PURE;

STDMETHOD(MyFunc2)(
_In_opt_ CONST void *srcData2,
UINT32 pitch2, 
) PURE;'''

import re

for i, m in enumerate(re.finditer(r'\bSTDMETHOD\b(.*?)\bPURE\b', txt, flags=re.S | re.M)):
    print 'Match {}:\n{}\n==='.format(i, m.group(1))
印刷品:

Match 0:
(MyFunc)(
D2D1_SIZE_U size,
_In_opt_ CONST void *srcData,
) 
===
Match 1:
(MyFunc2)(
_In_opt_ CONST void *srcData2,
UINT32 pitch2, 
) 
===
请注意带有
re.S | re.M

re.S
Make。匹配任何字符,包括换行符


如果你锚定你的匹配,你需要
re.M
,以便
^
$
将行的开头和结尾与
re.S

匹配,阅读“懒惰而不是贪婪”:顺便说一句,如果解决了你的问题,则标记为回答,并投票选出对你有帮助的答案