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

2024-04-28 05:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

以下是正则表达式:

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

它应该符合以下所有要求:

^{pr2}$

但只有其中一些(不应与下一行代码匹配:

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

也不应该匹配单行预处理器宏。在

我很确定上面的regex是有效的-但是正如我所说的,可能有更好的方法来实现它,我想有很多方法可以破坏它。有人能推荐吗?在


Tags: 方法代码iffoo处理器建议regex单行
2条回答

这是我设计的一个简单的测试程序:

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

我用的是:

^{pr2}$

与所用的用途非常相似,变化如下:

  1. [\t]在开始时避免换行 定义的。在
  2. 我依靠+存在 贪婪,所以我可以用一个简单的.*$at 最后得到的第一行 以\
start        = r"^\s*#define\s+"
continuation = r"(?:.*\\\n)+"
lastline     = r".*$"

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

相关问题 更多 >