<p>在将令牌转义为regex之后,可以使用<code>re.findall</code>:</p>
<pre><code>import re
items_list=[ '$', '^', '#', '(', ')', '-', '.', '/', '1', '2', '3', '4', '5', '6', '7', '=', 'Br',
'C', 'Cl', 'F', 'I', 'N', 'O', 'P', 'S', '[2H]', '[Br-]', '[C@@H]', '[C@@]', '[C@H]', '[C@]',
'[Cl-]', '[H]', '[I-]', '[N+]', '[N-]', '[N@+]', '[N@@+]', '[NH+]', '[NH2+]', '[NH3+]', '[N]',
'[Na+]', '[O-]', '[P+]', '[S+]', '[S-]', '[S@+]', '[S@@+]', '[SH]', '[Si]', '[n+]', '[n-]',
'[nH+]', '[nH]', '[o+]', '[se]', '\\', 'c', 'n', 'o', 's', '!', 'E']
string='N[C@H]1C[C@@H](N2Cc3nn4cccnc4c3C2)CC[C@@H]1c1cc(F)c(F)cc1F'
pattern = '|'.join(re.escape(item) for item in items_list)
tokens = re.findall(pattern, string)
print(len(tokens))
</code></pre>
<p>这里<code>tokens</code>将列出:</p>
<pre><code>['N', '[C@H]', '1', 'C', '[C@@H]', '(', 'N', '2', 'C', 'c', '3', 'n', 'n', '4', 'c', 'c', 'c', 'n', 'c', '4', 'c', '3', 'C', '2', ')', 'C', 'C', '[C@@H]', '1', 'c', '1', 'c', 'c', '(', 'F', ')', 'c', '(', 'F', ')', 'c', 'c', '1', 'F']
</code></pre>
<p>所以长度是44</p>
<p>注意这里的<code>|</code>表示“或”</p>
<p><strong>限制</strong>:请注意,这不会检查令牌是否代表字符串中的所有内容。如果有部分不构成令牌的一部分,那么它们将被忽略。如果要检查字符串实际上是否完全由此类标记组成,则可以检查:</p>
<pre><code>re.match(f'({pattern})*$', string)
</code></pre>
<p>如果没有,您将使用<code>None</code>而不是匹配项</p>