当前位置: 首页 > 知识库问答 >
问题:

python想要统计单个Go语言文件的类/属性/方法数量,但是为何只统计到1个方法?

郭阳曜
2024-08-04

想要统计.go文件内的类、属性、方法的数量:

import re

def count_go_elements(file_path):
    with open(file_path, 'r') as file:
        content = file.read()

        # 统计结构体
        struct_pattern = re.compile(r'type\s+(\w+)\s+struct')
        struct_names = struct_pattern.findall(content)
        struct_count = len(set(struct_names))  # 使用集合去重

        # 统计字段
        field_pattern = re.compile(r'(\w+)\s+(\w+)')
        fields = field_pattern.findall(content)
        field_count = len(fields)

        # 统计方法
        method_pattern = re.compile(r'func\s+\((.*?)\)\s+(\w+)\s*\((.*?)\)\s*{')
        methods = method_pattern.findall(content)
        method_count = len(methods)

    return struct_count, field_count, method_count

# 指定要统计的 Go 语言文件路径
file_path = '/Users/github_repos/kubernetes/pkg/kubelet/config/file_linux.go'

struct_count, field_count, method_count = count_go_elements(file_path)
print(f'结构体数量: {struct_count}')
print(f'字段数量: {field_count}')
print(f'方法数量: {method_count}')

执行结果为:

结构体数量: 1
字段数量: 121
方法数量: 1

go文件代码如下:可以看到里面不止1个func方法:

package config

import (
    "fmt"
    "os"
    "path/filepath"
    "strings"
    "time"

    "github.com/fsnotify/fsnotify"
    "k8s.io/klog/v2"

    "k8s.io/api/core/v1"
    "k8s.io/apimachinery/pkg/util/wait"
    "k8s.io/client-go/util/flowcontrol"
    kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
)

const (
    retryPeriod    = 1 * time.Second
    maxRetryPeriod = 20 * time.Second
)

type retryableError struct {
    message string
}

func (e *retryableError) Error() string {
    return e.message
}

func (s *sourceFile) startWatch() {
}

func (s *sourceFile) doWatch() error {
}

func (s *sourceFile) produceWatchEvent(e *fsnotify.Event) error {
}

func (s *sourceFile) consumeWatchEvent(e *watchEvent) error {
    switch e.eventType {
    case podAdd, podModify:
        pod, err := s.extractFromFile(e.fileName)
        if err != nil {
            return fmt.Errorf("can't process config file %q: %v", e.fileName, err)
        }
        return s.store.Add(pod)
    case podDelete:
        if objKey, keyExist := s.fileKeyMapping[e.fileName]; keyExist {
            pod, podExist, err := s.store.GetByKey(objKey)
            if err != nil {
                return err
            }
            if !podExist {
                return fmt.Errorf("the pod with key %s doesn't exist in cache", objKey)
            }
            if err = s.store.Delete(pod); err != nil {
                return fmt.Errorf("failed to remove deleted pod from cache: %v", err)
            }
            delete(s.fileKeyMapping, e.fileName)
        }
    }
    return nil
}

请问这个正则匹配是哪里的问题啊?

method_pattern = re.compile(r'func\s+\((.*?)\)\s+(\w+)\s*\((.*?)\)\s*{')

共有1个答案

孔乐邦
2024-08-04
func\s+\((.*?)\)\s+(\w+)\s*\((.*?)\)\s+(.*?)\s*{

这样就行了。
image.png

 类似资料:
  • 本文向大家介绍php简单统计中文个数的方法,包括了php简单统计中文个数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php简单统计中文个数的方法。分享给大家供大家参考,具体如下: 之前的公司是做外贸的用到的都是英文所以统计的长度的时候是用strlen这个函数,一直也没有错误,但是现在统计中文的时候这个就出错了,现在做一下记录测试 从上面的测试,我们可以看出: strlen 把中文

  • 本文向大家介绍python统计一个文本中重复行数的方法,包括了python统计一个文本中重复行数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python统计一个文本中重复行数的方法。分享给大家供大家参考。具体实现方法如下: 比如有下面一个文件 2 3 1 2 我们期望得到 2,2 3,1 1,1 解决问题的思路: 出现的文本作为key, 出现的数目作为value,然后按照valu

  • 本文向大家介绍C语言编程中统计输入的行数以及单词个数的方法,包括了C语言编程中统计输入的行数以及单词个数的方法的使用技巧和注意事项,需要的朋友参考一下 统计输入的行数 标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束。因此,统计行数等价于统计换行符的个数。 在该程序中,while 循环语句的循环体是一个 if 语句,它控制自增语句++nl。if 语句先测试圆括号中的条件,如果该条件为真

  • 本文向大家介绍php统计数组元素个数的方法,包括了php统计数组元素个数的方法的使用技巧和注意事项,需要的朋友参考一下 count():对数组中的元素个数进行统计; sizeof():和count()具有同样的用途,这两个函数都可以返回数组元素个数.可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0; array_co

  • 本文向大家介绍php简单统计字符串单词数量的方法,包括了php简单统计字符串单词数量的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php简单统计字符串单词数量的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的php程序设计有所帮助。

  • 本文向大家介绍Yii统计不同类型邮箱数量的方法,包括了Yii统计不同类型邮箱数量的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii统计不同类型邮箱数量的方法。分享给大家供大家参考,具体如下: 效果图: 控制器: 更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计