2008-09-13 5 views
5

Was folgt, ist ein regulärer Ausdruck, den ich geschrieben habe, um mehrzeilige Präprozessor-Makros in C/C++ - Code zu entsprechen. Ich bin auf keinen Fall ein Guru für regelmäßige Ausdrücke, also würde ich jeden Ratschlag begrüßen, wie ich das besser machen kann.Python-Regex, um mehrzeiligen Präprozessor-Makro

Hier ist die regex:

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

Es sollte dies alles passen:

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

Aber nur dieser Teil (sollte die nächste Zeile des Codes nicht überein:

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

Und sollte auch nicht einzeiligen Präprozessor-Makros übereinstimmen.

Ich bin mir ziemlich sicher, dass die Regex oben funktioniert - aber wie gesagt, gibt es wahrscheinlich eine bessere Möglichkeit, es zu tun, und ich stelle mir vor, dass es Möglichkeiten gibt, es zu brechen. Kann mir jemand etwas vorschlagen?

Antwort

5

Dies ist ein einfaches Testprogramm I knocked up:

#!/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) 

Die Wieder ich verwendet:

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

ist sehr ähnlich dem Gebrauch verwendet wird, die Änderungen:

  1. [\ t] Um Zeilenumbrüche am Anfang des Define zu vermeiden.
  2. Ich verlasse mich auf + gierig, so kann ich eine einfache verwenden. * $ Bei das Ende der ersten Zeile des zu bekommen definieren, dass mit \
nicht
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
Ende
Verwandte Themen