【发布时间】:2012-05-06 16:25:10
【问题描述】:
我正在寻找如何从某些 C 源文件中的函数中删除整个身体的方法。
例如我有这个内容的文件:
1. int func1 (int para) {
2. return para;
3. }
4.
5. int func2 (int para) {
6. if (1) {
7. return para;
8. }
9. return para;
10. }
我已经尝试过这些正则表达式:
content = re.sub('(\{[.*]?\})', '', content, flags=re.DOTALL)
但是嵌套的 { } 有问题。此正则表达式仅替换第一个 },因此第 9 行和第 10 行仍在内容中。我认为解决方案应该是计算 { 和 } 括号并在计数器为 0 时停止替换。{ 被发现 => counter++,} 被发现 => counter--。但我不知道如何在 python 中实现它。你们可以给我一脚吗?
【问题讨论】:
-
选择真正的解析器from some available options 可能会更好地为您服务——通过正则表达式解析 C 注定会令人沮丧和烦恼。我希望你可以让它适用于简单的玩具,但任何真正的代码库都可能会使用 some 构造,你无法用正则表达式复制。
-
出于好奇,您为什么要这样做?如果没有更好的方法来解决您的实际问题,我会感到非常惊讶。
-
我真正的问题是获取每个函数的返回类型、名称和参数列表,所以在匹配之前我想从源文件中删除所有无用的信息。例如宏、cmets 和实体。但是嵌套问题困扰着我。
-
看看这个问题,你必须使用递归。 stackoverflow.com/questions/10318351/…
-
理论说用正则表达式不可能做你想做的事。正则表达式处理正则语言(这就是它们的名字的来源)。具有匹配分隔符对的语言是不规则的。它充其量是上下文无关的(一大类语言)。您需要一个实际的解析器(请参阅@sarnold 的出色答案)。
标签: python c regex match substitution