使用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)


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

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

最佳答案



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


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

根本原因

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

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

关于python - re.search()和re.findall()正在挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52406347/

10-16 12:02
查看更多