擅长:python、mysql、java
<p>使用带有“向后看”和“向前看”的正则表达式:</p>
<pre><code>>>> import re
>>> string = "I want A and I want B and I want C and..."
>>> re.findall(r'(?<=want ).*?(?= and)', string)
['A', 'B', 'C']
</code></pre>
<h3>工作原理</h3>
<p>正则表达式分为三部分:</p>
<ul>
<li><p><code>(?<=want )</code></p>
<p>仅当前面有字符串<code>want</code>时才匹配</p></li>
<li><p><code>.*?</code></p>
<p>这匹配任何字符。后面的<code>?</code>使这个匹配不贪婪。这意味着它会找到满足整个正则表达式的最短字符串</p></li>
<li><p><code>(?= and)</code></p>
<p>仅当字符串中的该点后跟<code>and</code>时,才匹配</p></li>
</ul>
<p>另外,请注意<code>string</code>是标准模块的名称,最好不要选择可能与标准模块冲突的变量名</p>
<h3>备选方案</h3>
<p>正如AvinashRaj所指出的,我们也可以使用一个捕获组来完成这个任务,而不是使用“向后看,向前看”的组合:</p>
<pre><code>>>> re.findall(r'\bwant\s+(.*?)\s+and\b', string)
['A', 'B', 'C']
</code></pre>