2008-09-13 8 views
5

以下は、C/C++コードのマルチラインプリプロセッサマクロと一致するように記述した正規表現です。私は決して正規表現の専門家ではないので、私はこれをより良くする方法についてアドバイスを歓迎する。マルチラインプリプロセッサマクロと一致するPython正規表現

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

それはこのすべてを一致させる必要があります:ここで

は正規表現だ

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

しかし、これだけ(の一部は、コードの次の行と一致してはならない

また、1行のプリプロセッサマクロと一致しないようにしてください。

私はかなり上の正規表現が動作することを確信しています - しかし、私が言ったように、おそらくそれを行うより良い方法があり、それを壊す方法があると想像します。誰もが何かを提案できますか?

答えて

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) 
で終わっていない定義
関連する問題