You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:26:57