2015-05-04 5 views
1

мне нужно, чтобы соответствовать два типа строки, например, как показано ниже (разбор файла заголовка)RegEx ИЛИ оператор не работает в Python

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 

В сущности, я хочу, чтобы объединить эти два регулярных выражений:

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 это найти спички propely, но в 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

'| ** работает **, но у вас есть несколько групп захвата в выражении ... – jonrsharpe

+0

Результат, который я ищу в этом случае, - это всего лишь три функции, хорошо подобранные в списке, такие как: [' STDMETHOD_ (MyFunc) (D2D1_SIZE_U размер, _In_opt_ CONST void * srcData,) PURE ',' STDMETHOD (MyFunc2) (_ In_opt_ CONST void * srcData2, UINT32 pitch2,) PURE ',' STDMETHOD_ (void, GetFactory) (_ Outptr_ ID2D1Factory ** завод) CONST PURE '] – gmmo

ответ

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, который четко описывает поведение, которое вы наблюдали.

0

Вы можете «слить» в регулярных выражения, как это (так как они отличаются в подчеркивании, я просто добавил _? - «факультативное подчеркивание»):

(\bSTDMETHOD_?\b([\s\S]*?)\bPURE\b) 

См regex101 demo и IDEONE demo.

Вам не нужны флаги с [\s\S]*?, так как он соответствует любому символу, даже новой строке.

Смежные вопросы