2008-09-13 27 views
5

Biểu thức chính quy sau đây tôi đã viết để khớp với các macro xử lý trước nhiều dòng trong mã C/C++. Tôi không có nghĩa là một guru biểu thức thông thường, vì vậy tôi muốn chào đón bất kỳ lời khuyên nào về cách tôi có thể làm điều này tốt hơn.python regex để khớp với macro tiền xử lý đa dòng

Đây là regex:

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

Nó phải phù hợp với tất cả điều này:

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

Nhưng chỉ có một số này (không phải phù hợp với dòng tiếp theo của mã:

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

Và cũng không được khớp với các macro tiền xử lý một dòng.

Tôi khá chắc chắn rằng các regex ở trên hoạt động - nhưng như tôi đã nói, có lẽ có một cách tốt hơn để làm điều đó, và tôi tưởng tượng rằng có những cách để phá vỡ nó. Bất cứ ai có thể đề nghị bất kỳ?

Trả lời

5

Đây là một chương trình thử nghiệm đơn giản, tôi gõ lên:

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

Việc tái tôi đã sử dụng:

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

là rất giống với một sử dụng sử dụng, những thay đổi:

  1. [\ t] Để tránh các dòng mới khi bắt đầu của định nghĩa.
  2. Tôi dựa vào + là tham lam, vì vậy tôi có thể sử dụng một cách đơn giản. * $ Tại cuối cùng để có được những dòng đầu tiên của xác định rằng không kết thúc với \
4
start  = r"^\s*#define\s+" 
continuation = r"(?:.*\\\n)+" 
lastline  = r".*$" 

re_multiline_macros = re.compile(start + continuation + lastline, 
           re.MULTILINE) 
Các vấn đề liên quan