<p>要匹配一个以<code>ka toki</code>开头而不跟在<code>a</code>后面的整个字符串,可以使用</p>
<pre><code>re.match(r'ka toki(?!a).*$', s)
</code></pre>
<p>Python的<code>re.match</code>将匹配锚定在字符串的开头,因此,可以省略<code>^ka toki(?!a).*$</code>模式开头的<code>^</code>锚定</p>
<p>参见<a href="https://regex101.com/r/suOEoq/1" rel="nofollow noreferrer">regex demo</a></p>
<p><strong>图案细节</strong></p>
<ul>
<li><code>^</code>—字符串的开头(隐式在<a href="https://docs.python.org/2/library/re.html#re.match" rel="nofollow noreferrer">^{<cd3>}</a>中)</li>
<li><code>ka toki</code>-文字子串</li>
<li><code>(?!a)</code>-如果<code>a</code>字符跟在<code>ka toki</code>子字符串后面,则匹配失败的负<a href="https://www.regular-expressions.info/lookaround.html" rel="nofollow noreferrer"><strong>lookahead</strong></a></li>
<li><code>.*</code>-行的其余部分,0+个字符,而不是换行符(您可以使用<code>re.DOTALL</code>或<code>re.S</code>使其跨行匹配)</li>
<li><code>$</code>-字符串的结尾(实际上,如果只需要单行匹配,则可以省略它)</李>
</ul>
<p>请注意,通过在可选组中使用求反字符类,无需环顾即可实现相同的效果:</p>
<pre><code>re.match(r'ka toki(?:[^a].*)?$', s)
</code></pre>
<p>见<a href="https://regex101.com/r/suOEoq/2" rel="nofollow noreferrer">another regex demo</a></p>
<p>这里,<code>(?:[^a].*)?</code>是一个可选的非捕获组,它匹配除<code>a</code>(使用<code>[^a]</code>)之外的任何字符的1或0次出现,然后<code>.*</code>匹配字符串的其余部分</p>