<p>试用:</p>
<pre><code>re.search('^(.*?)(Arguments:.*?)?(Returns:.*)?$', s, re.DOTALL)
</code></pre>
<p>只需通过附加一个<code>?</code>,使第二组和第三组<em>可选,并通过(再次)在前两组<em>的限定符上附加一个<code>?</code>,使前两组<em>的限定符非贪婪</em>(是的,令人困惑)。</p>
<p>另外,如果在模式的第一组上使用非贪婪修饰符,它将匹配可能最短的子字符串,对于<code>.*</code>来说,它是空字符串。您可以通过在模式末尾添加行尾字符(<code>$</code>)来克服此问题,这将强制第一组匹配尽可能少的字符以满足模式,即,当没有<code>Arguments</code>和<code>Returns</code>节时,以及这些节之前的所有内容(如果存在)时,整个字符串都将匹配。</p>
<p><strong>编辑:</strong>好的,如果您只想捕获</em>标记<code>Arguments:</code>和<code>Returns:</code>之后的文本<em>,那么您将不得不在多个组中进行折叠。我们不会使用所有的组,所以用<code><?P<name></code>符号命名它们(<em>另一个</em>问号,argh!)-开始有意义了:</p>
<pre><code>>>> m = re.search('^(?P<description>.*?)(Arguments:(?P<arguments>.*?))?(Returns:(?P<returns>.*))?$', s, re.DOTALL)
>>> m.groupdict()['description']
"Test if a column field is larger than a given value\n This function can also be called as an operator using the '>' syntax\n\n "
>>> m.groupdict()['arguments']
'\n - DbColumn self\n - string or float value: the value to compare to\n in case of string: lexicographic comparison\n in case of float: numeric comparison\n '
>>> m.groupdict()['returns']
'\n DbWhere object'
>>>
</code></pre>