python正则表达式匹配多行预处理器宏 下面是我编写的正则表达式,用于匹配C/C++代码中的多行预处理器宏。我绝不是正则表达式大师,所以我欢迎任何关于如何改进的建议

python正则表达式匹配多行预处理器宏 下面是我编写的正则表达式,用于匹配C/C++代码中的多行预处理器宏。我绝不是正则表达式大师,所以我欢迎任何关于如何改进的建议,python,regex,Python,Regex,这是正则表达式: \s*#define(.*\\\n)+[\S]+(?!\\) 它应该与所有这些匹配: #define foo(x) if(x) \ doSomething(x) 但只有部分(不应与下一行代码匹配): #define foo(x) if(x) \ doSomething(x) normalCode(); 也不应该匹配单行预处理器宏 我很确定上面的正则表达式是有效的——但正如我所说,可能有更好的方法来实现它,我想也有办法打破它。有人能提出一些建议吗?这是我设计的一个简单测试程

这是正则表达式:

\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)
我使用的re:

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)