2008-09-13 13 views
5

से मिलान करने के लिए पायथन रेगेक्स सी/सी ++ कोड में बहु-लाइन प्री-प्रोसेसर मैक्रोज़ से मेल खाने के लिए मैंने जो नियमित अभिव्यक्ति लिखा है, वह निम्नानुसार है। मैं नियमित रूप से नियमित अभिव्यक्ति गुरु नहीं हूं, इसलिए मैं इस बारे में कोई सलाह लेता हूं कि मैं इसे कैसे बेहतर बना सकता हूं।बहु-लाइन प्रीप्रोसेसर मैक्रो

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

यह इस सब से मेल खाना चाहिए:

यहाँ regex है

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

लेकिन केवल इस (के कुछ कोड की अगली पंक्ति से मेल नहीं करना चाहिए:

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

और सिंगल-लाइन प्रीप्रोसेसर मैक्रोज़ से भी मेल नहीं खाना चाहिए।

मुझे पूरा यकीन है कि उपरोक्त regex काम करता है - लेकिन जैसा कि मैंने कहा, शायद यह करने का एक बेहतर तरीका है, और मुझे कल्पना है कि इसे तोड़ने के तरीके हैं। क्या कोई सुझाव दे सकता है?

उत्तर

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) 
साथ अंत नहीं है पाने के लिए
संबंधित मुद्दे