使用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)
在涉及多行时,两种尝试都只是停止响应。
以前有人遇到过这个问题吗?还是我完全愚蠢,缺少明显的东西?
答案 0 :(得分:1)
解决方案
r"#define [A-Z,_]*\([^()]+\)"
否定的字符类[^()]
匹配除(
和)
(包括换行符)以外的任何字符,并且+
量词使正则表达式引擎匹配1个或多个连续出现的他们。
根本原因
正则表达式模式中的(?:.|\s)+?
(当要遵循其他子模式时)会导致扩展操作过多(这是一个惰性模式,我们只能谈论使用贪婪修饰符的回溯),从而冻结了正则表达式引擎。此备用组的主要问题是.
可以与\s
匹配。当一组中的交替可以在同一位置匹配时,这总是一个瓶颈,因为一旦一个替代失败,另一个尝试就会被尝试,并且如果对这个组进行量化,则会继续尝试更多次(如此处所示)。
您总是希望.
带有DOTALL
修饰符或[\s\S]
,而只需要在部分模式中应用此行为(在Python re
中, [\S\s]
workaround和re
does not support modifier groups很有帮助)。