Python 在多行上匹配表达式
我正在用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)
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分钟。