0

我正在努力def ([^\s]+)\([^\.]*\)在 Python 中提取模式。但是,当我有多行输入时,只会获得第一次出现。我在我的 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']

4

2 回答 2

2

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

于 2013-11-10T23:38:29.350 回答
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']
于 2013-11-10T23:39:17.237 回答