如何修改Python3 re正则规则匹配所有factorial函数调用?
正则匹配所有factorial函数调用的修改方案
原正则失效原因
- 开头的
{固定前缀匹配+.*贪婪模式会从第一个左大括号加空格的位置开始,吞掉所有后续字符,仅保留最后一处符合factorial\s*\(.*\)规则的片段,所以只能拿到最后一个匹配结果 - 括号内的
.*贪婪匹配也可能出现跨括号匹配的异常
修改方案
基础方案(匹配所有factorial(xxx)格式片段)
直接使用无分组的正则匹配整段目标内容,findall会直接返回所有符合要求的完整匹配:
import re s = '''double factorial ( double n ) { if ( n == 0 ) { return 1 ; } if ( n == 1 ) { return factorial(n - 2 + 1) ; } return n * factorial ( n - 1 ) ; }''' l = re.findall(r'factorial\s*\([^)]*\)', s) # 如需排除开头的函数定义片段,切片即可 l = l[1:] print(l) # 输出结果:['factorial(n - 2 + 1)', 'factorial ( n - 1 )']
正则逻辑说明:
factorial精确匹配函数名\s*兼容函数名和左括号之间的任意数量空格[^)]*匹配所有非右括号的字符,避免贪婪匹配越界\)匹配右括号闭合
优化方案(直接排除函数定义,仅匹配调用)
增加负向后行断言,过滤掉前面带返回值类型double 的函数定义场景,无需后续切片处理:
l = re.findall(r'(?<!double )factorial\s*\([^)]*\)', s)
内容的提问来源于stack exchange,提问作者Ashutosh
相关产品推荐
相关产品推荐

