2008-09-13 13 views
5

Lo que sigue es una expresión regular que he escrito para que coincida con macros de preprocesador de varias líneas en código C/C++. De ninguna manera soy un gurú de expresiones regulares, por lo que agradecería cualquier consejo sobre cómo puedo mejorarlo.python regex para que coincida con la macro del preprocesador de varias líneas

Aquí es la expresión regular:

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

debe coincidir con todo esto:

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

Pero sólo un poco de esto (no debe coincidir con la siguiente línea de código:

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

Y tampoco debería coincidir con las macros de preprocesador de una sola línea

Estoy bastante seguro de que la expresión regular anterior funciona, pero como dije, probablemente hay una mejor manera de hacerlo, y me imagino que hay formas de romperla. ¿Alguien puede sugerir alguno?

Respuesta

5

Este es un programa simple prueba Llamé a:

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

La re utilicé:

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

es muy similar a la usada utilizado, los cambios:

  1. [\ t] Para evitar nuevas líneas al inicio de la definición.
  2. que dependen de + siendo codicioso, así que se puede usar un simple. * $ al final para conseguir la primera línea de la definir ahí no termina con \
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
Cuestiones relacionadas