Python 在多行上匹配表达式

Python 在多行上匹配表达式,python,regex,multiline,Python,Regex,Multiline,我正在用Python提取模式def([^\s]+)\([^\.]*\)。但是,当我有多行输入时,只会获得第一个匹配项。我在Python正则表达式上有特定的re.MULTILINE选项,但仍然无效。假设我有以下输入: def a(): pass b() def b(): pass 我的正则表达式只提取“a”,而不继续提取“b”。我使用的代码是: self.function_re = re.compile(r'def (\S+)\([^\.]*\)', re.MULTILINE)

我正在用Python提取模式
def([^\s]+)\([^\.]*\)
。但是,当我有多行输入时,只会获得第一个匹配项。我在Python正则表达式上有特定的
re.MULTILINE
选项,但仍然无效。假设我有以下输入:

def a():
    pass
b()
def b():
    pass
我的正则表达式只提取“a”,而不继续提取“b”。我使用的代码是:

self.function_re = re.compile(r'def (\S+)\([^\.]*\)', re.MULTILINE)
print(self.function_re.findall(self.code))

它输出
['a']

我猜您的参数列表模式太贪婪了,一直匹配到字符串中的最后一个右括号。尝试使用
def(\S+)([^\.]*?\)
(注意参数列表中“零或多”量词后的
限定符)。

这是因为
\([^\.]*\)
部分是贪婪的,即它匹配从第一个括号到最后一个括号的整个部分:

>>> r = re.compile(r'def ([^\s]+)(\([^\.]*\))')
>>> r.findall(test)
[('a', '():\n        pass\nb()\ndef b()')]
如果通过将
附加到星号来使其不贪婪,则应该可以:

>>> r = re.compile(r'def ([^\s]+)\([^\.]*?\)')
>>> r.findall(test)
['a', 'b']

您是否使用
re.search
re.findall
?请注意,您可以使用
\S
而不是
[^\S]
。是的,我会,但我必须等待10分钟。