提问者:小点点

Python正则表达式匹配在特定字符串中挂起


我正在尝试使用正则表达式匹配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

注意:我在行的开头添加这个数字和标识符,以便能够得到函数开始的行号


共1个答案

匿名用户

正如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 )