我正在尝试使用正则表达式匹配c函数名,这在相当大/复杂的文件中工作得很好。 然而,它被困在一个特定的行,并进入一个无限循环。
正则表达式:
func_re = re.compile("^" +"((?P<line_num>\d+)" + " END_LINE_NUM" + ")*\s*(static)*\s*[a-z0-9_]+\s*\**\s+(?P<func_name>[a-z0-9_]+)\s*\((?P<func_arg>\s*\s*[a-z0-9_]+\**\s*(?:[a-z0-9_]+)\s*,?)*\s*\)\s*{?\s*$", re.MULTILINE | re.I | re.S )
for m in re.finditer(func_re, string):
print("found...")
字符串包含以下内容:
1 END_LINE_NUM ( this_is_a_test_function_exact_size( p_point_er->member ) == FALSE ) &&
2 END_LINE_NUM
注意:我在行的开头添加这个数字和标识符,以便能够得到函数开始的行号
正如Wiktor所指出的,它的灾难性回溯。
这个简单的修复方法很有帮助(删除标记为--><--)
func_re = re.compile("^" +"((?P<line_num>\d+)" + " END_LINE_NUM" + ")--->*<---\s*(static)*\s*[a-z0-9_]+\s*\**\s+(?P<func_name>[a-z0-9_]+)\s*\((?P<func_arg>\s*\s*[a-z0-9_]+\**\s*(?:[a-z0-9_]+)\s*,?)*\s*\)\s*{?\s*$", re.MULTILINE | re.I | re.S )