首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >re.search()和re.findall()挂起

re.search()和re.findall()挂起
EN

Stack Overflow用户
提问于 2018-09-19 12:53:19
回答 1查看 397关注 0票数 2

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

代码语言:javascript
复制
#define SOME_FUNCTION( someArgument, someMoreArgument)

有时,当他们有大量的争论时,他们会被包装起来,所以他们看起来如下:

代码语言:javascript
复制
#define ANOTHER_FUNCTION( moreArgument, evenMoreArguments,
                          anAwfulLotOfArguments, youGetIt)

现在,我使用python扫描这些文件,以找到这些定义中的每一个。我的regex看起来如下:

代码语言:javascript
复制
#define [A-Z,_]*\((?:.|\s)+?\"

在测试引擎(如regex101.com )中使用单行和多行定义测试这一点时,它工作得完美无缺。

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

代码语言:javascript
复制
regexFullMacro = re.compile("#define [A-Z,_]*\((?:.|\s)+?\)")
match = regexFullMacro.search(searchString)

以及

代码语言:javascript
复制
regexFullMacro = re.compile("#define [A-Z,_]*\((?:.|\s)+?\)")
match = regexFullMacro.findall(searchString)

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

有没有人曾经有过这样的问题,或者我只是完全愚蠢,错过了一些显而易见的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-19 13:41:02

溶液

代码语言:javascript
复制
r"#define [A-Z,_]*\([^()]+\)"

否定字符类[^()]匹配任何字符,但() (包括换行符),而+量化符使正则表达式引擎匹配1次或多次连续出现的字符。

根源

regex模式中的(?:.|\s)+? (当有其他子模式需要遵循时)会导致太多的扩展操作(这是一个懒惰的模式,我们只能用贪婪的修饰符来讨论回溯)来冻结regex引擎。这个替换组的主要问题是.可以匹配\s匹配的内容。当一个组中的替换可以在同一个位置匹配时,它始终是一个瓶颈,因为一旦一个选项失败,另一个选项被尝试,如果组被量化(如这里),将继续尝试更多次。

您总是希望.具有DOTALL修饰符或[\s\S],而不是当只需要将此行为应用于模式的一部分时(在Pythonre中,解决办法作为不支持修饰符组。非常有用)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52406347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档