背景

当前在工程中有已经实现好了的很多c函数,由于某些原因,需要在所有c函数中临时加些一样的语句,这些语句最后会删除

解决方案1

参考: https://codeantenna.com/a/Rh6TZnp9Km
经过一番研究和搜索,得出以下的一个正则表达式(注意调用的时候忽略换行符),
该表达式可以查找几乎所有形式的函数(函数返回值是自定义的结构体的除外),他的优点是可以定位函数的任一部位(函数返回值,函数名,第一个参数,等),缺点是在正常的代码环境中,由于匹配项太多,速度非常慢.很不实用

表达式

# 匹配字符串
rgl_func_def = r'''(\s*) #匹配所有的空白字符(   (const)?(volatile)?(static)?\s*(inline)?\s*(extern)?\s*((VOID)|(void)|(enum)|((unsigned)?(signed)?(long)?\s*(int)|(char)|(float)|(short)|(long)|(double))|(bool)|(struct\s*\w+)|(union\s*\w+)|(wait_queue_t)|(wait_queue_head_t)|(\w+))\s*(fastcall)?)  #匹配函数返回类型(\s*(\*)?\s*) #识别有无指针类型*,以及空白字符(\w+) #识别函数名称 ((\s*)(\()(\n)?) #识别函数开始小括号((\s*)?(const)?(volatile)?(\s*)? #参数前是否有const、volatile(   (static)?\s*(inline)?\s*(extern)?\s*((VOID)|(void)|(enum)|((unsigned)?(signed)?(long)?\s*\s*(int)|(char)|(float)|(short)|(long)|(double))|(bool)|(struct\s*\w+)|(union\s*\w+)|(wait_queue_t)|(wait_queue_head_t)|(\w+))\s*(fastcall)?) #参数类型(\s*)(\*)?(\s*)?(restrict)?(\s*)?(\w+)(\s*)?(\[(\d|\s)*?\])?(\s*)?(\,)?(\n)?(.*)?)* ((\s*)(\))(\n)?) #函数结束小括号
'''

解决方案2

按照c函数的特点,函数的结构一定是如下:
返回类型(至少是一个词),指针(可能有),函数名,(,参数,)

而且参数中,包括的符号类型不多,因此得出以下正则表达式

rgl = r'\w+(\s|\n|\*)+\w+(\s|\n)*\((\s|\n|!|%|&|\(|\)|\*|\+|,|-|\/|\w|\[|\\|\]|\^|\||~|<{2}|>{2})*?\)(\n|\s)*\{'

解释

这里最主要的就是用 (\s|\n|!|%|&|(|)|*|+|,|-|/|\w|[|\|]|^|||~|<{2}|>{2} 来表示函数的参数部分,常规来说,该表达式能匹配到所有的函数定义,但由于有的写法合法但是不常规,所以有可能会导致匹配到的不是函数定义(只是有可能,我暂时还没遇到)

所以这里给出了一个防范于未然的措施
1.对于 (\s|\n|!|%|&|(|)|*|+|,|-|/|\w|[|\|]|^|||~|<{2}|>{2} , 这里给出了几个常见的合法组合但一定不会出现在函数定义的表达式

rgl_exclude_list = [r'&&', r'\|\|', '->']

可以在匹配到的结果里检查上面几个表达式,如果有,那就不是函数定义

2.最好把c语言的注释先过滤掉,在注释里会写很多非法语句,很有可能会被匹配到.

结论

以上就是我的方案,我使用了方案2解决了问题,并且没有匹配到额外的情况(我也是把注释语句过滤掉之后再匹配的)

python正则表达式匹配c语言的函数相关推荐

  1. Python正则表达式匹配C语言函数

    以下python代码主要用于匹配各种类型的C语言函数,使用的为re.search,意味着包含,如果需要完全匹配请用re.match. # coding=utf-8 import re# 匹配函数,包含 ...

  2. Python正则表达式匹配中文

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 参照Py ...

  3. python正则表达式匹配字符串相关方法

    python正则表达式匹配字符串相关方法 一.匹配方法简要介绍及注意事项 1.贪婪匹配与非贪婪匹配 2.findall与search的选取问题 3.匹配时"()"和"[] ...

  4. python正则表达式re模块之findall函数

    python正则表达式re模块之findall函数 1. re.findall函数介绍 2. findall函数捕获分组 3. re.findall中正则表达式(.*?) 4. re.findall中 ...

  5. python正则表达式匹配字符串中的电话号码_Python正则表达式匹配字符串中的数字...

    这篇文章主要介绍了Python正则表达式匹配字符串中的数字,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1.使用"\d+"匹配全数字 代码: ...

  6. Python正则表达式匹配字符串中的数字

    导读 这篇文章主要介绍了Python正则表达式匹配字符串中的数字,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1.使用"\d+"匹配全数字 ...

  7. 转载Python正则表达式匹配反斜杠'\'问题(——字符串转义与正则转义)

    个人总结(非转载部分): 1.原始字串(字符串前加r,如r'xxx')常用在正则表达式中,在正则表达运算中,要进行正则转义(原始字串不原始) 实例: 2.普通字串若要用于正则表达式中,会先进行&quo ...

  8. Python正则表达式匹配数字和小数

    Python正则表达式匹配数字和小数 1.匹配数字 import restr_date = 'hello world today is 2022.4.15 ok' num_list = re.find ...

  9. python - 正则表达式匹配汉字

    python - 正则表达式匹配汉字 Unicode 编码中汉字编码的范围在 \u4e00 到 \u9fa5之间 所以 匹配任意汉字: [\u4e00-\u9fa5] 匹配某个汉字可以把汉字转换成Un ...

最新文章

  1. 后台的代理nginx部署方法
  2. WSHPSRS-匹克选择列表生成器-SRS(R12.2.3)
  3. 启用轻资产、重运营、降杠杆,红星美凯龙能否瘦成“家得宝”?
  4. 网络安全、Web安全、渗透测试之笔经面经总结(二)
  5. Python基础学习----参数和返回值
  6. 关于两个php.ini的说明
  7. signature=9e6873686326b073f8f457fa0e6c2f70,Signature required
  8. C++学习之路 | PTA乙级—— 1023 组个最小数 (20分)(精简)
  9. php switch正则表达式,switch的用法以及正则表达式简单的用法
  10. jave double相加结果误差+尾巴
  11. python实现模拟登录云课堂智慧职教并获取课程信息(1)
  12. 2021.04.02学习记录列表
  13. gatk过滤_GATK使用方法详解(相关参数和参考文件说明)
  14. 关于在工作中遇到的问题及解决方案
  15. 萤光云服务器,你值得拥有
  16. Linux下TBB安装及编译
  17. 成为“黑客”前,必须学习的“计算机网络通信原理”
  18. Python工资一般多少?
  19. 用 Python 抓取公号文章保存成 PDF
  20. GRR(评价重复性和再现性)

热门文章

  1. 2023Matlab初级教程- 第一章 初识Matlab与界面介绍
  2. 用HTML和css写一个简单地购物小票
  3. 做一个检测钩子程序的工具
  4. 时隔多年,腾讯再次上线 Linux 版 QQ !
  5. 乐高ev3搭建图_乐高EV3摩天轮搭建说明,适合摆在前台吸引小朋友
  6. 到底什么是上采样、下采样
  7. PhotonServer入门教程
  8. HTML文件的书写规范、HTML标签的介绍、HTML标签的语法
  9. jprofiler远程监控JVM( spring boot项目)
  10. webpack学习之2.自动编译、实时重载LiveReload、热替换HMR