如何仅读取和剥离特定的代码行? 我正在编写一个Python程序,它从文件夹中读取C++程序文件。然后程序只从C++代码中读取某些部分,并将它们写入新的单独文件。

如何仅读取和剥离特定的代码行? 我正在编写一个Python程序,它从文件夹中读取C++程序文件。然后程序只从C++代码中读取某些部分,并将它们写入新的单独文件。,python,c++,regex,strip,Python,C++,Regex,Strip,这是我试图删除的C++代码: #包括 int max(int num1,int num2); //选择方法 int main(){ INTA=100; int b=200; int ret; ret=最大值(a,b); printf(“最大值为:%d\n”,ret); 返回0; } 整数最大值(整数m1,整数m2){ int结果; 如果(num1>num2) 结果=num1; 其他的 结果=num2; 返回结果; } 我唯一感兴趣的部分是用a标记的 //选择方法注释。在上面的示例代码中,这将是

这是我试图删除的C++代码:

#包括
int max(int num1,int num2);
//选择方法
int main(){
INTA=100;
int b=200;
int ret;
ret=最大值(a,b);
printf(“最大值为:%d\n”,ret);
返回0;
}
整数最大值(整数m1,整数m2){
int结果;
如果(num1>num2)
结果=num1;
其他的
结果=num2;
返回结果;
}
我唯一感兴趣的部分是用a标记的
//选择方法
注释。在上面的示例代码中,这将是
main()
方法

现在我有一个python代码,它读取这个文件并将所有文件内容写入一个输出文件。但是,我想修改代码,以便输出文件仅包含以下内容:

int main(){
INTA=100;
int b=200;
int ret;
ret=最大值(a,b);
printf(“最大值为:%d\n”,ret);
返回0;
}
到目前为止,我掌握的python代码如下:

导入全局
导入操作系统路径
文件列表=glob.glob('/my/input/files/*.cc'))
def main():
对于\u文件列表中的文件\u名称:
打印(文件名)
f=打开(文件名“r”)
lst=[];
plist=[];
对于f中的行:
fline=直线条带()
一级附加(弗林)
plist.append(行)
f、 关闭()
打印(lst)
f=open(os.path.join(“/my/output/files/path”,
os.path.basename(文件名)),'w')
对于plist中的第2行:
f、 写入(第2行)
f、 关闭()
如果名称=“\uuuuu main\uuuuuuuu”:
main()

如何修改代码以仅提取以
//selectmethod
开头的行下面的方法

您可以使用一个简单的正则表达式来实现,下面是一个示例代码 搜索时,表达式使用单行选项
re.S
将文件视为单个字符串,允许捕获多行。 Regex是搜索/替换文本的一种非常强大和高效的方法,有关更多信息,请参阅

重新导入
#表示C文件的多行字符串
string=”“”
#包括
int max(int num1,int num2);
//选择方法
int main(){
INTA=100;
int b=200;
int ret;
ret=最大值(a,b);
printf(“最大值为:%d\n”,ret);
返回0;
}
整数最大值(整数m1,整数m2){
int结果;
如果(num1>num2)
结果=num1;
其他的
结果=num2;
返回结果;
}
"""
result=re.search(“int main\s*\(\s*\)\s*\{.*?\}”,字符串,re.s).group()
打印(结果)

一般来说,即使代码被“正确”格式化,这个任务也等于创建完整的C++分析器。对于那些在单行上查找单<代码> } /COD>字符的人来说,作为C++代码的一个例子,它包含原始字符串文字中的两个错误阳性:

#include <iostream>
int main()
{
    std::cout << R"(Rules: You may use any JSON string but the following three characters are forbidden by Big Brother Inc.:
$
!
}

Example of JSON string:
{
  "name":"value"
}
)";
    return 0;
}
#包括
int main()
{

STD::你是在问如何在Python中编写一个C++解析器,这样它就可以知道函数在哪里开始和结束了?这不是一个简单的任务。如果你可以假设代码是正确的缩进,你可以简单地把所有东西从<代码> /StuttStase< /C> >下一行,只包含<代码> } /代码>。@循环中有什么
if
for
?它还将有一个
}
。在这种情况下,您必须跟踪遇到的
{
数量。但是
}
不会在行首,它前面会有空格。这就是我所说的“假定代码正确缩进”的意思。这就是我希望实现的解决方案。对于不同类型的方法(例如,不是“main”的方法和内部有很多if和else语句的方法,这仍然有效吗?这可以使用递归或子例程来完成,也就是说,这个表达式将完全匹配您想要的
int\s*main\s*(\{(?:[^}{]*|(?1))*\})
上面使用的是Python本机不支持的子例程;这个子例程在Python中使用递归,但不能与
int main
部分
\{[^}{]*+(?:(?R)[^}{]*])*+\}
这里要感谢这个答案
#include <iostream>
int main()
{
    std::cout << R"(Rules: You may use any JSON string but the following three characters are forbidden by Big Brother Inc.:
$
!
}

Example of JSON string:
{
  "name":"value"
}
)";
    return 0;
}