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)