在使用re.search()或re.findall()时,我遇到了问题。但让我先解释一下。我正在搜索C代码,其中包含如下定义:
#define SOME_FUNCTION( someArgument, someMoreArgument)有时,当他们有大量的争论时,他们会被包装起来,所以他们看起来如下:
#define ANOTHER_FUNCTION( moreArgument, evenMoreArguments,
anAwfulLotOfArguments, youGetIt)现在,我使用python扫描这些文件,以找到这些定义中的每一个。我的regex看起来如下:
#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)当涉及到多行时,两种尝试都会停止响应。
有没有人曾经有过这样的问题,或者我只是完全愚蠢,错过了一些显而易见的东西?
发布于 2018-09-19 13:41:02
溶液
r"#define [A-Z,_]*\([^()]+\)"否定字符类[^()]匹配任何字符,但(和) (包括换行符),而+量化符使正则表达式引擎匹配1次或多次连续出现的字符。
根源
regex模式中的(?:.|\s)+? (当有其他子模式需要遵循时)会导致太多的扩展操作(这是一个懒惰的模式,我们只能用贪婪的修饰符来讨论回溯)来冻结regex引擎。这个替换组的主要问题是.可以匹配\s匹配的内容。当一个组中的替换可以在同一个位置匹配时,它始终是一个瓶颈,因为一旦一个选项失败,另一个选项被尝试,如果组被量化(如这里),将继续尝试更多次。
您总是希望.具有DOTALL修饰符或[\s\S],而不是当只需要将此行为应用于模式的一部分时(在Pythonre中,解决办法作为不支持修饰符组。非常有用)。
https://stackoverflow.com/questions/52406347
复制相似问题