我需要匹配两种类型的字符串,例如下面的(解析头文件)
txt='''\
STDMETHOD_(MyFunc)(
D2D1_SIZE_U size,
_In_opt_ CONST void *srcData,
) PURE;
STDMETHOD(MyFunc2)(
_In_opt_ CONST void *srcData2,
UINT32 pitch2,
) PURE;\
STDMETHOD_(void, GetFactory)(
_Outptr_ ID2D1Factory **factory
) CONST PURE;
'''
matches = re.findall(r'(\bSTDMETHOD\b((.|\n|\r)*?)\bPURE\b)|(\bSTDMETHOD_\b((.|\n|\r)*?)\bPURE\b)',txt, flags=re.DOTALL | re.M)
print matches
本质上我想结合这两个RegExes:
r'(\bSTDMETHOD\b((.|\n|\r)*?)\bPURE\b)'
r'(\bSTDMETHOD_\b((.|\n|\r)*?)\bPURE\b)'
但是OR运算符不起作用。让我感到困惑的是,如果我将它们粘贴为
(\bSTDMETHOD\b((.|\n|\r)*?)\bPURE\b)|(\bSTDMETHOD_\b((.|\n|\r)*?)\bPURE\b)
在Notepad ++或VisualStudio中它确实找到匹配,但在Python中我得到一堆空字符串,重复字符串,缺少关键字_STDMETHOD
等等......这是输出:
[stdout:][
(
'',
'',
'',
'STDMETHOD_(MyFunc)(\nD2D1_SIZE_U size,\n_In_opt_ CONST void *srcData,\n) PURE',
'(MyFunc)(\nD2D1_SIZE_U size,\n_In_opt_ CONST void *srcData,\n) ',
' '
),
(
'STDMETHOD(MyFunc2)(\n_In_opt_ CONST void *srcData2,\nUINT32 pitch2, \n) PURE',
'(MyFunc2)(\n_In_opt_ CONST void *srcData2,\nUINT32 pitch2, \n) ',
' ',
'',
'',
''
),
(
'',
'',
'',
'STDMETHOD_(void, GetFactory)(\n_Outptr_ ID2D1Factory **factory\n) CONST PURE',
'(void, GetFactory)(\n_Outptr_ ID2D1Factory **factory\n) CONST ',
' '
)
]
如果有人能发现错误,我非常感谢。
答案 0 :(得分:0)
尝试使用finditer
并向每个匹配对象询问整个匹配项:
for match in re.finditer(r'... your regex ...',txt, flags=re.DOTALL | re.M):
print repr(match.group())
输出:
'STDMETHOD_(MyFunc)(\nD2D1_SIZE_U size,\n_In_opt_ CONST void *srcData,\n) PURE'
'STDMETHOD(MyFunc2)(\n_In_opt_ CONST void *srcData2,\nUINT32 pitch2, \n) PURE'
'STDMETHOD_(void, GetFactory)(\n_Outptr_ ID2D1Factory **factory\n) CONST PURE'
并查看the doc,其中清楚地描述了您观察到的行为。
答案 1 :(得分:0)
你可以"合并"像这样的正则表达式(因为它们在下划线上有所区别,我刚刚添加了_?
- 一个"可选的下划线"):
(\bSTDMETHOD_?\b([\s\S]*?)\bPURE\b)
您不需要[\s\S]*?
的任何标记,因为它匹配任何字符,甚至是换行符。