<p>如果word3只能出现在第一位或第三位,并且中间的单词可以是任何单词字符,那么一种选择是对两种场景使用带有<a href="https://www.regular-expressions.info/alternation.html" rel="nofollow noreferrer">alternation</a>的负前瞻<code>(?!</code></p>
<pre><code>^(?:word3 \w+ (?!word3$)\w+|(?!word3 )\w+ \w+ word3)$
</code></pre>
<p><strong>解释</strong></p>
<ul>
<li><code>^</code>字符串的开头</li>
<li><code>(?:</code>非捕获组
<ul>
<li><code>word3 \w+ </code>匹配<code>word3</code>空格1+单词字符和空格</li>
<li><code>(?!word3$)</code>负向前看,断言直接在右边的不是紧跟字符串末尾的word3</li>
<li><code>\w+</code>如果前面的断言为true,则匹配1+单词字符</li>
<li><code>|</code>或</li>
<li><code>(?!word3 )</code>负向前看,断言右边不是紧跟空格的单词3</li>
<li><code>\w+ \w+ word3</code>匹配1+字字符、空格1+字字符空格和<code>word3</code></li>
</ul></li>
<li><code>)</code>关闭组</li>
<li><code>$</code>字符串的结尾</li>
</ul>
<p><a href="https://regex101.com/r/XVLnF5/1" rel="nofollow noreferrer">Regex demo</a><a href="https://ideone.com/gdJIu0" rel="nofollow noreferrer">Python demo</a></p>
<p><em>示例代码</em></p>
<pre><code>import re
strings = [
"word1 word2 word3",
"word3 word1 word2",
"word3 word3 word2",
"word3 word2 word3",
"word1 word3 word2",
"word1 word2 word2"
];
pattern = r"(?:word3 \w+ (?!word3$)\w+|(?!word3 )\w+ \w+ word3)"
r = re.compile(pattern)
for s in strings:
print (bool(r.match(s)))
</code></pre>
<p><em>输出</em></p>
<pre><code>True
True
True
False
False
False
</code></pre>