我目前正在编写一个Python脚本,它将搜索整个.c
或.h
文件并查找所有函数定义,以便我可以进行一些轻微的编辑。要查找所有函数定义,我尝试使用正则表达式。
我目前拥有的是:
"r'\w+?\s+?\w+?\s*?\(.*?\)[\n\s]*?{"
这种逻辑的问题在于它在某些情况下目前会接受某些if
语句。例如:
else
if(//herpderp){}
这样做是因为\s
包含\n
。如果我的表达式只查找空格而不是任何空格,我觉得我不会遇到这个问题,但我无法测试我的理论,因为似乎没有\(insert letter here)
只是一个简单的空间。
所以有问题。如果您对如何修复我的正则表达式有任何建议,或者如果有更好的方法来编写脚本,请告诉我。
答案 0 :(得分:2)
使用单个空格可以匹配单个空格,就像您匹配任何不属于元字符的其他字符一样:
"r'\w+? +?\w+? *?\(.*?\)\s*?{"
' +?'
序列只匹配一个或多个空格,非贪婪。我已将[\n\s]
替换为\s
,因为已包含\n
。
您可以扩展为包含更多类型空格的字符类:
[ \t]
可以匹配空格或制表符。
答案 1 :(得分:1)
这样做是因为\ s包含\ n
我不确定这是一个好理论,因为在C中写这样的东西是允许的:
int
main()
一种可能的方法是使用黑名单或白名单来确保您获得的是一种功能。例如:
r'\b(int|float|double|char)\s+(\w+)\s*\([^)]*\)\s*{' // whitelist
或
r'(?!(?:else)\b)\b(\w+)\s+(\w+)\s*\([^)]*\)\s*{' // blacklist
注意:不需要使用延迟量词。