簡體   English   中英

python正則表達式匹配多行預處理器宏

[英]python regex to match multi-line preprocessor macro

以下是我編寫的正則表達式,用於匹配C / C ++代碼中的多行預處理器宏。 我絕不是一名正則表達大師,所以我歡迎任何關於我如何能做得更好的建議。

這是正則表達式:

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

它應該匹配所有這些:

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

但只有一部分(不應該匹配下一行代碼:

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

並且也不應該匹配單行預處理器宏。

我很確定上面的正則表達式有效 - 但正如我所說,可能有更好的方法,我想有辦法打破它。 任何人都可以建議嗎?

這是一個簡單的測試程序,我敲了一下:

#!/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. 我依賴於+貪婪,所以我可以使用一個簡單的。* $來獲得定義的第一行,而不是以\\結尾
start        = r"^\s*#define\s+"
continuation = r"(?:.*\\\n)+"
lastline     = r".*$"

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM