擅长:python、mysql、java
<p><strong>TL;DR:</strong><code>r'<clipPath.* id="[a-zA-Z0-9]+".*>\s*<path.*d=("(?:.*\n)+?")'</code></p>
<p>让我们把它分解。。。在</p>
<p>您从:<code>r'(<clipPath.* id=".*".*>\s*<path.*d="(.*\n)+")'</code>开始,它将整个捕获模式封装在一个组中,因此整个元素将被捕获到match对象中。让我们去掉那些括号:<code>r'<clipPath.* id=".*".*>\s*<path.*d="(.*\n)+"'</code></p>
<p>其次,你可能会很贪婪,因为这很危险。对于clipPath id,如果您知道id总是字母数字的,一个更好的解决方案可能是<code>r'<clipPath.* id="[a-zA-Z0-9]+".*>\s*<path.*d="(.*\n)+"'</code></p>
<p>最后,让我们看看您真正想要捕获什么。您的示例显示您希望捕获引号,所以让我们在捕获组中获取引号:<code>...*d=("(.*\n)+")</code>。不过,这给我们留下了一个奇怪的嵌套组情况,所以让我们将内部组设为非捕获:<code>...*d=("(?:.*\n)+")</code>。在</p>
<p>现在我们正在捕获你想要的,但是我们仍然有一个问题。。。如果有多个元素满足这些条件呢?贪婪地匹配<code>+</code>中的<code>...*d=("(.*\n)+")</code>将捕获其间的任何一条线。我们可以在这里做的是使<code>+</code>非贪婪的,方法是在<code>?</code>:<code>...*d=("(?:.*\n)+?")</code>后面加一个<code>?</code>。在</p>
<p>把这些东西放在一起:</p>
<p><code>r'<clipPath.* id="[a-zA-Z0-9]+".*>\s*<path.*d=("(?:.*\n)+?")'</code></p>