用于匹配模块中所有Python定义的正则表达式

2024-10-02 08:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python模块,我想捕获它的所有公共方法,例如,没有私有或子方法

def Func1(c, v1=None, v2=None, v3=None):
    def childFunc(c): # I don't want to catch this

这是我的正则表达式:

/def ([a-zA-Z]\w+\([\w, =]+\)):/

但是,这也匹配了子方法,并且它不适用于跨多行的定义:

def Func2(c, v1=None, v2=None, v3=None, \
v4=None, v5=None):

Tags: 模块to方法nonedefv3thisv2
3条回答

使用

(?m)^def ([a-zA-Z]\w*)\(([^()]*)\):

proof

^{tb1}$

在使用大括号和大括号的任何其他语言中,试图将子函数拒之门外很快就会成为使用正则表达式的噩梦。但在Python中,它实际上似乎是可行的。试试这个:

^(?:\t| {4})def ([a-zA-Z]\w*\([^:]*\)):

4表示一条缩进行使用了多少空格,因此根据需要进行更改

Demo

这不仅包括函数定义(与其他答案一样),还包括整个函数。

^def \w+\([^\f\v\r\n]*?\)\:[\s\S]+?^(?![ \t#])

解释

^def 匹配一行的开头,后跟一个“def”和一个空格“”

\w+与函数名匹配

\([^\f\v\r\n]*?\)\:匹配一个括号,其中包含任何不是新行开头的内容(lazy),后跟“:”

[\s\S]+?完全匹配任何内容(懒惰)

^匹配行的开头

(?![ \t#])要求下一步不是空格、制表符或注释的开头

相关问题 更多 >

    热门问题