RegEx OR运算符不在Python中工作

时间:2015-05-04 22:55:43

标签: python regex

我需要匹配两种类型的字符串,例如下面的(解析头文件)

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 ',
        ' '
    )
]

如果有人能发现错误,我非常感谢。

2 个答案:

答案 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)

请参阅regex101 demoIDEONE demo

您不需要[\s\S]*?的任何标记,因为它匹配任何字符,甚至是换行符。