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