擅长:python、mysql、java
<ol>
<li>必须转义特殊字符</李>
<li>根据定义,单词边界<code>\b</code>是一个与。。。单词字符<code>\w</code>或<code>[a-zA-z0-9_]</code>与非单词字符<code>\W</code>或<code>[a-zA-z0-9_]</code>之间的边界</李>
</ol>
<p>在您的例子中,您有regex:<code>\bHIPAA\b|\bERP(2.0)\b</code></p>
<p>前一个<code>\bHIPAA\b</code>没有问题,但后一个<code>\bERP(2.0)\b</code>显示了两个错误</p>
<ol>
<li>帕伦一家必须逃走</李>
<li>最后一个单词边界需要一个紧跟在结束符后面的单词字符</李>
</ol>
<p>要转义特殊字符,必须使用<code>re.escape</code>函数:</p>
<pre><code>re.escape(w) for w in keywords
</code></pre>
<p>要在不使用<code>\b</code>的情况下检测单词边界,必须声明关键字前后没有单词字符,因此必须使用lookaround:</p>
<ul>
<li><code>(?<!\w)</code>在关键字“负向后看”之前,确保之前没有单词字符</li>
<li><code>(?!\w)</code>在关键字后面,负向前看,确保后面没有单词字符</李>
</ul>
<p>您的正则表达式变成:</p>
<pre><code>r = re.compile('|'.join([r'(?<!\w)%s(?!\w)' % re.escape(w) for w in keywords]), flags=re.I)
</code></pre>
<p><a href="https://regex101.com/r/LjCL9i/1" rel="nofollow noreferrer">Demo & explanation</a></p>