python正则表达式匹配多行预处理宏
接下来是我写的一个正则表达式,用来匹配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)+.*$"
这个正则表达式和你用的很相似,主要的变化有:
- 我加了[ \t],这样可以避免在定义的开头出现换行。
- 我依赖于+这个符号是贪婪的,所以我可以在最后用简单的.*$来获取第一个不以\结尾的定义行。