在多行上匹配表达式

时间:2013-11-10 23:31:58

标签: 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)
print(self.function_re.findall(self.code))

哪个输出['a']

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

>>> 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']