#regex #visual-studio-code
#регулярное выражение #visual-studio-code
Вопрос:
Я хочу найти определение функции python и часть тела
Что я пробовал: Мое выражение: ^((?:[s]{0,4})*)def[ ].*[(].*[)][:](n.*s)1.*
как вы можете видеть в выражении изображения, оно не является точным, в частности, конечная часть. любой эксперт по регулярным выражениям хотел бы что-то предложить? Спасибо!
Пример текста:
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]
, оно используется, чтобы убедиться, что тело функции имеет отступ от подписи функции по крайней мере на один пробел или табуляцию. В качестве тела функции будут использоваться только строки с таким отступом или пустые.
Комментарии:
1. его работа Я не знаю, почему вам не нравится, но да, она ломается, когда функция содержит пустые строки, как я обновляю в своем вопросе «func2». так что это не ваша вина. Я пытаюсь это исправить, если вы узнаете, пожалуйста, обновите. Большое вам спасибо за ваши усилия. (Проголосуйте за меня)
2. @MohitGhodasara смотрите обновленный ответ. Если это вас устраивает, вы можете принять его.
3. он работает так, как ожидалось. не могли бы вы объяснить в последней части, как он решит, что это конец тела функции? Еще раз спасибо
4. @MohitGhodasara, смотрите конец обновленного ответа.