<p>是的,我相信正则表达式不可能与wim指出的self-call混淆的情况相匹配。{1{self}在这里,self}是很直接的。此正则表达式正确匹配原始问题中列出的所有测试用例:</p>
<pre class="lang-py prettyprint-override"><code>reobj = re.compile(r"""
# Match (unreliably) Python function with self reference.
^ # Anchor to start of line.
([ \t]*) # $1: Indentation of DEF statement.
def[ \t]+ # Function definition.
([^\s(]+) # $2: Name of function to find.
.*\r?\n # Remainder of function def line.
(?: # Zero or more lines w/o funcname.
(?: # Function block lines alternatives.
\1[ \t]+ # Func block lines have extra indentation.
(?:(?!\b\2\s*\().)* # Optional non-funcname stuff on line
| [ \t]*\#.* # Allow comment lines to defy indent rules.
)? # Allow blank lines in function block.
\r?\n # End of line not containing funcname.
)* # Zero or more lines w/o funcname
\1[ \t]+ # Now match the line having funcname.
(?:(?!\b\2\s*\().)* # Optional non-funcname stuff on line
\b\2\s*\( # Match the function self reference.
""", re.MULTILINE | re.VERBOSE)
</code></pre>
<p>它以函数定义行开始匹配,并捕获组<code>$1</code>中<code>'def'</code>之前的空白缩进和组<code>$2</code>中的函数名。然后它匹配函数块中不包含函数名的行,这些行的前导空格多于函数定义。它跳过空行和只包含注释的行。它一旦在函数块中找到一行,该行的函数名后跟左括号,表示对自身的调用,就声明匹配。否则将继续查找下一个匹配项,否则将继续查找不匹配项。在</p>
<p>请注意,此解决方案是不可靠的,如果函数名出现在字符串中或某行中其他代码后面的注释中,则会导致误报。它也不处理包含多行原始字符串的函数。不过,它会正确捕捉到不少!在</p>