首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python - Regexp -查找函数名称,但不查找函数调用

Python - Regexp -查找函数名称,但不查找函数调用
EN

Stack Overflow用户
提问于 2013-04-23 22:34:11
回答 1查看 102关注 0票数 0

好的,我有一堆C和C++代码,我需要过滤它们,找出函数定义。我不知道函数类型/返回值,也不知道函数定义或函数调用中的参数数量等。

到目前为止,我有:

代码语言:javascript
复制
import re, sys
from os.path import abspath
from os import walk

function = 'msg'
regexp = r"(" + function + ".*[^;]){"

found = False
for root, folders, files in walk('C:\\codepath\\'):
    for filename in files:
        with open(abspath(root + '/' + filename)) as fh:
            data = fh.read()
            result = re.findall(regexp, data)
            if len(result) > 0:
                sys.stdout.write('\n Found function "' + config.function + '" in ' + filename + ':\n\t' + str(result))
                sys.stdout.flush()
    break

然而,这会产生一些不想要的结果。regexp必须是these taulrant,例如以下组合:

找到"msg“的防御,但不是"msg()”调用,在所有的变体中说:

代码语言:javascript
复制
void
shapex_msg (struct shaper *s)
{
  msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
       s->bytes_per_second);
}

代码语言:javascript
复制
void shapex_msg (struct shaper *s)
{
  msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
       s->bytes_per_second);
}

代码语言:javascript
复制
void shapex_msg (struct shaper *s) {
  msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
       s->bytes_per_second);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 22:47:14

可能类似于下面的正则表达式:

代码语言:javascript
复制
def make_regex(name):
    return re.compile(r'\s*%s\s*\([^;)]*\)\s*\{' % re.escape(name))

测试您的示例:

代码语言:javascript
复制
>>> text = '''
... void
... shapex_msg (struct shaper *s)
... {
...   msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
...        s->bytes_per_second);
... }
... 
... void shapex_msg (struct shaper *s)
... {
...   msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
...        s->bytes_per_second);
... }
... 
... void shapex_msg (struct shaper *s) {
...   msg (M_INFO, "Output Traffic Shaping initialized at %d bytes per second",
...        s->bytes_per_second);
... }'''
>>> shapex_msg = make_regex_for_function('shapex_msg')
>>> shapex_msg.findall(text)
['\nshapex_msg (struct shaper *s)\n{', ' shapex_msg (struct shaper *s)\n{', ' shapex_msg (struct shaper *s) {']

它仅适用于多行定义:

代码语言:javascript
复制
>>> shapex_msg.findall('''int
        shapex_msg      (
int a,
int b
)  

        {'''
['\n   \tshapex_msg   \t(\nint a,\nint b\n)  \n\n\t{']

而对于函数调用:

代码语言:javascript
复制
>>> shapex_msg.findall('shapex_msg(1,2,3);')
[]

需要注意的是,您的正则表达式无法工作,因为.*很贪婪,因此它没有匹配正确的右括号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16172103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档