re.search()和re.findall()正在挂起

时间:2018-09-19 12:53:20

标签: python regex

使用re.search()或re.findall()时遇到问题。但是,让我先解释一下。我正在搜索包含以下定义的C代码:

#define SOME_FUNCTION( someArgument, someMoreArgument)

有时候,当它们有很多参数时,它们会被包装,因此它们看起来像这样:

#define ANOTHER_FUNCTION( moreArgument, evenMoreArguments,
                          anAwfulLotOfArguments, youGetIt)

现在,我正在使用python扫描这些文件,以查找这些定义中的每个定义。我的正则表达式如下:

#define [A-Z,_]*\((?:.|\s)+?\"

regex101.com之类的测试引擎中使用单行和多行定义对此进行测试时,它可以完美运行。

但是,当我将它与python(3.4.1)一起使用时,它仅适用于单行定义。当它尝试扫描多行定义时,它只是停止执行(尽管我可以用Ctrl + C中断它)。我尝试使用:

regexFullMacro = re.compile("#define [A-Z,_]*\((?:.|\s)+?\)")
match = regexFullMacro.search(searchString)

以及

regexFullMacro = re.compile("#define [A-Z,_]*\((?:.|\s)+?\)")
match = regexFullMacro.findall(searchString)

在涉及多行时,两种尝试都只是停止响应。

以前有人遇到过这个问题吗?还是我完全愚蠢,缺少明显的东西?

1 个答案:

答案 0 :(得分:1)

解决方案

r"#define [A-Z,_]*\([^()]+\)"

否定的字符类[^()]匹配除()(包括换行符)以外的任何字符,并且+量词使正则表达式引擎匹配1个或多个连续出现的他们。

根本原因

正则表达式模式中的(?:.|\s)+?(当要遵循其他子模式时)会导致扩展操作过多(这是一个惰性模式,我们只能谈论使用贪婪修饰符的回溯),从而冻结了正则表达式引擎。此备用组的主要问题是.可以与\s匹配。当一组中的交替可以在同一位置匹配时,这总是一个瓶颈,因为一旦一个替代失败,另一个尝试就会被尝试,并且如果对这个组进行量化,则会继续尝试更多次(如此处所示)。

您总是希望.带有DOTALL修饰符或[\s\S],而只需要在部分模式中应用此行为(在Python re中, [\S\s] workaroundre does not support modifier groups很有帮助)。