2008-09-13 7 views
5

Aşağıda, C/C++ kodunda çok satırlı ön işlemci makroları eşleştirmek için yazdığım düzenli bir ifade var. Ben hiçbir şekilde düzenli ifadeler gurusu değilim, bu yüzden bunu nasıl daha iyi yapabileceğime dair herhangi bir tavsiyeyi memnuniyetle karşılarım.python regex

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

Tüm bunların uymalıdır: Burada

regex var

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

Ama sadece bu (bazı kod sonraki satırla aynı olmamalıdır

Ayrıca, tek satırlı önişlemci makroları eşleşmemelidir.

Yukarıdaki ifadenin işe yarayacağına eminim - ama dediğim gibi, muhtemelen bunu yapmanın daha iyi bir yolu var ve bunu kırmanın bir yolu olduğunu hayal ediyorum. Herhangi biri önerebilir mi?

cevap

5

Bu benim hamile basit bir test programıdır:

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

kullandığım re:

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

kullanılan bir kullanımdan çok benzer mi, değişiklikler:

  1. [\ t] Tanımın başındaki yeni satırlardan kaçınmak için.
  2. ben açgözlü olma + itimat, bu yüzden basit kullanabilirsiniz. * ucunda $ ilk satırı o \
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
ile bitmiyor tanımlamak için