如何分别匹配多个多行python函数定义

时间:2017-03-14 22:27:09

标签: python regex

我一直在努力编写一个可以匹配我想要的正则表达式。

我希望能够解析整个python源文件,并为该文件获取所有函数定义的列表。

我编写了一些示例文本来解析,尝试接受python函数def中的所有各种复杂性:

def New_function_withSomestuff10(test: str, thing: str,
                                 third: float, last=a(10): int) -> str:
    test

def stuff(things):
    stuff

def New_function_withSomestuff11(test: str, thing: str,
                                 third: float, last: int) -> str:
    test

我有一个当前的正则表达式似乎与这些匹配,但它似乎匹配所有这些:

regex = r'def (?P<name>\w*)\([\s\S]*\):[\s\S]*'

“名称”捕获组仅返回“New_function_withSomestuff10”,并且该捕获组之后的所有内容都会将所有内容写入示例文本的末尾。

我希望得到

re.findall(regex, sample_text)
-> ['New_function_withSomestuff10', 'stuff', 'New_function_withSomestuff11']

任何人都可以帮助我理解我做错了什么吗?我一直试图围绕贪婪与懒惰的量词,前瞻/后瞻和其他这样有用的工具,但他们似乎没有做我需要的东西(或者,更可能的是,我只是错误地使用它们)。 / p>

1 个答案:

答案 0 :(得分:0)

我希望以下内容会有所帮助:

regex=r"def (?P<name>\w+)\(.*?\)"
re.findall(regex, sample_text, re.DOTALL)

#['New_function_withSomestuff10', 'stuff', 'New_function_withSomestuff11']

说明:

Regex: def (?P<name>\w+)\(.*?\)

  • def 从字面上匹配字符def(区分大小写)
  • 命名捕获组名称 (?P <名称> \ w +)
    • \ w 匹配任何单词字符(等于[a-zA-Z0-9 _])
    • +量词-匹配一次和无限次,次数尽可能多,并根据需要返回(贪婪)
  • 匹配字符(从字面上(区分大小写)
  • 。*?匹配任何字符
    • * 量词-匹配零次和无限制次数,尽可能少地次数,根据需要扩展(延迟)
  • 与字符)按字面值匹配(区分大小写)

Flag: re.DOTALL

  • 如果已指定DOTALL标志,则它将匹配包括换行符在内的任何字符。