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

5 投票
2 回答
1648 浏览
提问于 2025-04-11 09:21

接下来是我写的一个正则表达式,用来匹配C/C++代码中的多行预处理宏。我并不是正则表达式的专家,所以如果有人能给我一些建议,让我这个表达式更好,我会非常感激。

这是我的正则表达式:

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

它应该能匹配以下所有内容:

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

但只应该匹配其中的一部分(不应该匹配下一行代码):

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

而且也不应该匹配单行的预处理宏。

我很确定上面的正则表达式是有效的,但正如我所说的,可能还有更好的方法来实现这个功能,我想也有可能会被破解。有没有人能给我一些建议呢?

2 个回答

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

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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

6

这是我随便写的一个简单测试程序:

#!/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. 我依赖于+这个符号是贪婪的,所以我可以在最后用简单的.*$来获取第一个不以\结尾的定义行。

撰写回答