Как узнать определение функции Python с помощью регулярного выражения vscode

#regex #visual-studio-code

#регулярное выражение #visual-studio-code

Вопрос:

Я хочу найти определение функции python и часть тела

Что я пробовал: Мое выражение: ^((?:[s]{0,4})*)def[ ].*[(].*[)][:](n.*s)1.* как вы можете видеть в выражении изображения, оно не является точным, в частности, конечная часть. любой эксперт по регулярным выражениям хотел бы что-то предложить? Спасибо!

Редактор VSCode

Пример текста:

 def func1():
    print("line")
    print("line")
    print("line")

def func2(self, vals):
    print("line")

    print("line")
    print("line")

class cls1(cls2):

    def method1(self):
        print("line")
        print("line")
        print("line")
        print("line")

    def method2(self):
        def inner():
            print("line")
        print("line")
  

Комментарии:

1. Не могли бы вы скопировать код python, с которым вы проверяете свое регулярное выражение, в свой вопрос в виде текста?

2. @AlexanderMashin Конечно! это сделано.

Ответ №1:

Это регулярное выражение может вам помочь : (?P<indent>[ t]*)def[ t]*(?P<name>w )s*((?P<params>.*?))(?:[ t]*->[ t]*(?P<return>w ))?:(?P<body>(?:n(?P=indent)(?:[ t] [^n]*)|n) ) .

Части определения функции будут записаны как name , params , return и body .

Обратите внимание на обратную (?P=indent) ссылку . Вместе со следующим (?:[ t] , оно используется, чтобы убедиться, что тело функции имеет отступ от подписи функции по крайней мере на один пробел или табуляцию. В качестве тела функции будут использоваться только строки с таким отступом или пустые.

https://regex101.com/r/WWUa8A/4 .

Комментарии:

1. его работа Я не знаю, почему вам не нравится, но да, она ломается, когда функция содержит пустые строки, как я обновляю в своем вопросе «func2». так что это не ваша вина. Я пытаюсь это исправить, если вы узнаете, пожалуйста, обновите. Большое вам спасибо за ваши усилия. (Проголосуйте за меня)

2. @MohitGhodasara смотрите обновленный ответ. Если это вас устраивает, вы можете принять его.

3. он работает так, как ожидалось. не могли бы вы объяснить в последней части, как он решит, что это конец тела функции? Еще раз спасибо

4. @MohitGhodasara, смотрите конец обновленного ответа.