为何Python正则无法捕获含下划线的C函数调用?如何修改?
问题解析与修复方案
为什么你的正则没捕获到func_call()?
先提个反常点:从你贴的代码来看,这两个正则**本应该能捕获到func_call**啊!毕竟:
[a-zA-Z][a-zA-Z0-9_]*完全符合func_call的命名规则(字母开头,后续可跟字母、数字、下划线)\w+也能匹配它(\w本身就等价于[a-zA-Z0-9_])
如果实际运行确实没捕获到,大概率是这几个小问题:
- 输入字符串里
func_call()前面的换行是Windows风格的\r\n,而你的正则只用了\n,导致开头匹配失败 - 函数调用行前面的空白是特殊空白字符(比如全角空格),不过
\s一般能覆盖常见的空白类型 - 极少数情况下,正则匹配的位置被前面的匹配意外消耗了,但
re.findall是全局搜索,这种情况很少见
怎么修改正则确保捕获所有合法函数调用?
给你两个更健壮的方案,适配各种场景:
方案1:精准匹配行首的函数调用(推荐)
利用re.MULTILINE模式让^匹配每一行的开头(包括换行后的行首),这样不管换行符是啥,都能精准定位函数调用:
import re line = "int main(){\n func();\n func_1();\n func_call();\n}" # 优化后的正则:行首空白 + 合法函数名 + 左括号 p = re.compile(r'^\s*([a-zA-Z][a-zA-Z0-9_]*)\(', re.MULTILINE) print("Optimized Regex:-\t{}".format(re.findall(p, line)))
运行输出:
Optimized Regex:- ['func', 'func_1', 'func_call']
方案2:兼容多类型换行符
如果你的代码需要处理Windows和Linux混合的换行符,可以把换行匹配改成\r?\n(匹配\n或\r\n):
p = re.compile(r'\r?\n\s*([a-zA-Z][a-zA-Z0-9_]*)\(')
不过还是方案1更靠谱,因为它不依赖具体的换行符类型,直接锚定行首,匹配更准确。
补充说明
方案1里的正则严格遵循C语言函数名规则:必须以字母开头,后面可以跟字母、数字、下划线。如果你的场景里函数名可能有其他合法字符(比如一些扩展场景),可以调整字符集,但默认情况下这个规则是没问题的。
内容的提问来源于stack exchange,提问作者Praveen kumar
相关产品推荐
相关产品推荐

