2008-09-13 5 views
5

다음은 C/C++ 코드의 멀티 라인 전 처리기 매크로와 일치하도록 작성한 정규 표현식입니다. 나는 결코 정규 표현식 전문가가 아니므로, 내가 이것을 더 잘 만들 수있는 방법에 대한 조언을 환영 할 것입니다.파이썬 정규식 멀티 라인 전 처리기 매크로

\s*#define(.*\\\n)+[\S]+(?!\\) 

그것은이 모든 일치해야합니다 : 여기

는 정규식의

#define foo(x) if(x) \ 
doSomething(x) 
normalCode(); 
:
#define foo(x) if(x) \ 
doSomething(x) 

만이 (일부 코드의 다음 줄과 일치하지 말아야

또한 한 줄 전처리 매크로와 일치하지 않아야합니다.

위의 정규 표현식이 효과가 있다는 것을 확신합니다.하지만 말했듯이, 아마도 그것을하는 더 좋은 방법이있을 것입니다. 그리고 그것을 깨뜨리는 방법이 있다고 상상해 봅니다. 누구든지 어떤 제안 할 수 있습니까?

답변

5

이 나는 ​​노크 간단한 테스트 프로그램입니다 :

#!/usr/bin/env python 

TEST1=""" 
#include "Foo.h" 
#define bar foo\\ 
    x 
#include "Bar.h" 
""" 

TEST2=""" 
#define bar foo 
#define x 1 \\ 
    12 \\ 
    2 \\\\ 3 
Foobar 
""" 

TEST3=""" 
#define foo(x) if(x) \\ 
doSomething(x) 
""" 

TEST4=""" 
#define foo(x) if(x) \\ 
doSomething(x) 
normalCode(); 
""" 

import re 
matcher = re.compile(r"^[ \t]*#define(.*\\\n)+.*$",re.MULTILINE) 

def extractDefines(s): 
    mo = matcher.search(s) 
    if not mo: 
     print mo 
     return 
    print mo.group(0) 

extractDefines(TEST1) 
extractDefines(TEST2) 
extractDefines(TEST3) 
extractDefines(TEST4) 

내가 사용하는 재 :

r"^[ \t]*#define(.*\\\n)+.*$" 

가 사용 된 사용과 매우 유사, 변경 :

  1. [\ t] 처음에 개행을 피하려면 을 정의하십시오.
  2. 나는 는 욕심 +에 의존하는, 그래서 간단하게 사용할 수 있습니다. * 끝에 $가 의 첫 번째 줄은 그 \
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
으로 끝나지 않는 정의 얻을