如何用正则表达式识别C文件中umsg_前缀的函数调用?
修正正则表达式匹配C文件中的umsg格式函数调用
需求:解析C源文件,找出所有符合umsg_xxxxx_yyyy_zzz(aaa,bbb,ccc,ddd)格式的函数调用,示例如下:
umsg_test_uints_subscribe(1,1) umsg_sensors_imu_receive(sub,&msg,portMAX_DELAY) umsg_sensors_imu_publish(&imu_data); umsg_sensors_imu_peek(&peek_msg);
原代码问题:使用的正则umsg_[a-z]+\(.*\)无法匹配目标内容,核心问题有两个:
[a-z]+仅匹配连续小写字母,无法适配函数名中用于分隔的下划线(比如umsg_sensors_imu_receive里的多段下划线命名).*是贪婪匹配规则,会从左括号开始一直匹配到行尾的最后一个右括号,可能包含无关内容,若行内有多个函数调用还会出现匹配错误
修正后的代码:
import re file_path = "你的C文件路径.c" with open(file_path, 'r') as f: for line in f: # 提取所有符合格式的函数调用 matches = re.findall(r'umsg_[a-z_]+\([^)]*\)', line) if matches: for match in matches: print(match)
正则表达式说明:
umsg_:匹配固定前缀[a-z_]+:匹配由小写字母和下划线组成的函数名部分,支持多段下划线分隔的命名规则\(:转义匹配左括号(正则中括号属于特殊语法字符,需转义)[^)]*:匹配任意非右括号的字符,精准锁定括号内的参数内容,避免贪婪匹配带来的冗余\):转义匹配右括号
如果需要保留整行内容而非仅提取函数调用,可调整为:
import re file_path = "你的C文件路径.c" with open(file_path, 'r') as f: for line in f: if re.search(r'umsg_[a-z_]+\([^)]*\)', line): print(line.strip())
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

