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