我正在努力在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']
。
答案 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']