python正则表达式以匹配多行预处理器宏

时间:2020-03-05 18:52:46  来源:igfitidea点击:

接下来是我编写的正则表达式,用于匹配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)+.*$"

与所使用的一种用法非常相似,其变化如下:

  • [\ t]避免在定义开始处使用换行符。
  • 我依靠+贪婪,因此我可以在末尾使用简单的。* $来获取不以\结尾的定义的第一行

回答

start        = r"^\s*#define\s+"
continuation = r"(?:.*\\n)+"
lastline     = r".*$"

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