<p>您可以通过匹配来排除<code>soymilk</code>{<cd2>}杏仁奶<code>and</code>杏仁奶`并在捕获组中仅捕获牛奶,该组将由<a href="https://docs.python.org/3/library/re.html#re.findall" rel="nofollow noreferrer">re.findall</a>返回</p>
<pre><code>\b(?:soy|almond)\s?milk\b|\b(milk)\b
</code></pre>
<p>模式匹配:</p>
<ul>
<li><code>\b</code>防止部分匹配的单词边界</li>
<li><code>(?:soy|almond)</code>匹配大豆或杏仁</li>
<li><code>\s?milk\b</code>匹配可选的空格char和milk,后跟单词边界</li>
<li><code>|</code>或</li>
<li><code>\b(milk)\b</code>在<strong>组1</strong>中捕获被单词边界包围的牛奶</li>
</ul>
<p>您还可以使用<code>[^\S\r\n]</code>而不是<code>\s</code>来匹配没有换行符的空格,因为后者可以匹配换行符</p>
<p><a href="https://regex101.com/r/t7aFDj/1" rel="nofollow noreferrer">Regex demo</a><a href="https://ideone.com/VS65JV" rel="nofollow noreferrer">Python demo</a></p>
<p>比如说</p>
<pre><code>import re
regx = r"\b(?:soy|almond)\s?milk\b|\b(milk)\b"
food = "is combined with creamy soy and milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))
food = "is combined with creamy milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))
</code></pre>
<p>输出</p>
<pre><code>['milk']
['milk']
</code></pre>
<p>另一种选择是使用<a href="https://pypi.org/project/regex/" rel="nofollow noreferrer">PyPi regex module</a></p>
<pre><code>(?<!\b(?:soy|almond)\s*(?:milk)?)\bmilk\b
</code></pre>
<p>模式匹配:</p>
<ul>
<li><code>(?<!</code>负向后看,断言直接在左边的不是</li>
<li><code>\b(?:soy|almond)</code>单词边界,匹配大豆或杏仁</li>
<li><code>\s*(?:milk)?</code>匹配可选的空格字符,然后选择milk</li>
<li><code>)</code>近距离观察</li>
<li><code>\bmilk\b</code>在单词边界之间匹配milk</li>
</ul>
<p><a href="https://regex101.com/r/ukDAAj/1" rel="nofollow noreferrer">Regex demo</a><a href="https://tio.run/##tZDNDoIwEITvfYqVEzWEizej4UW4tLSFjfQn2xol8d2xFe9c9DY7yew3mbCkybvTuqINnhKQHvWTsSBS0uTgClTV3eXQy7o7R7@8xGy9U7yPx2xYnG@8470sopcVY8Z7lUMVRhi8lei0ggemCQbSwi6QX4BwCkqgBQGG7pg2i7QhHSd0I0QM4A3EQPlqoGJFpPrTrTXolJjn@luxgcLkfJ/9D@YudNvr9@h1fQM" rel="nofollow noreferrer">Python demo</a></p>