这是一个纯python解决方案,实现起来非常简单。
提取身体的功能
基本上,您尝试将每个{
与相应的匹配}
:
{
如果在下一个之前有两个,}
那么您正在进入一个范围。
- 另一方面,如果
}
在 next 之前有一个{
,那么您将退出范围。
然后实现是微不足道的:
- 您在不同列表中查找
{
和维护的所有索引}
- 您还维护一个范围深度变量
- 如果当前
{
位置低于当前}
位置,则您正在进入一个范围,您将范围深度加 1,然后移动到下一个{
位置
- 如果当前
{
位置高于当前}
位置,则您正在退出范围,您将 1 移至范围深度并移动到下一个}
位置
- 如果作用域深度变量为 0,那么您找到了函数体的右大括号
假设您的字符串在函数体的第一个大括号之后开始(不包括大括号),使用此子字符串调用以下函数将为您提供最后一个大括号的位置:
def find_ending_brace(string_from_first_brace):
starts = [m.start() for m in re.finditer('{', string_from_first_brace, re.MULTILINE)]
ends = [m.start() for m in re.finditer('}', string_from_first_brace, re.MULTILINE)]
i = 0
j = 0
current_scope_depth = 1
while(current_scope_depth > 0):
if(ends[j] < starts[i]):
current_scope_depth -= 1
j += 1
elif(ends[j] > starts[i]):
current_scope_depth += 1
i += 1
if(i == len(starts)): # in case we reached the end (fewer { than })
j += 1
break
return ends[j-1]
提取候选函数定义
现在,如果文件的原始字符串在变量my_content
中,
find_func_begins = [m for m in re.finditer("\w+\s+(\w+)\s*\((.*?)\)\s*\{", my_content)]
会给你每个函数的原型(find_func_begins[0].group(1) == func1
和find_func_begins[0].group(2) == 'int para')
,和
my_content[
find_func_begins[0].start():
find_func_begins[0].end() +
find_ending_brace(my_content[find_func_begins[0].end():])]
会给你正文的内容。
提取原型
我想您应该在到达第一个结束大括号后再次查找函数定义,因为正则表达式 forfind_func_begins
有点松散。迭代每个函数定义并匹配大括号会产生以下迭代算法:
reg_ex = "\w+\s+(\w+)\s*\((.*?)\)\s*\{"
last = 0
protos = ""
find_func_begins = [m for m in re.finditer(reg_ex, my_content[last:], re.MULTILINE | re.DOTALL)]
while(len(find_func_begins) > 0):
function_begin = find_func_begins[0]
function_proto_end = last + function_begin.end()
protos += my_content[last: function_proto_end-1].strip() + ";\n\n"
last = function_proto_end + find_ending_brace(my_content[function_proto_end:]) + 1
find_func_begins = [m for m in re.finditer(reg_ex, my_content[last:], re.MULTILINE | re.DOTALL)]
你应该有你想要的protos
。希望这可以帮助!