<p>这可以通过前瞻性断言来实现:</p>
<pre><code>^(?=.*a)(?=.*b)(?=.*c)
</code></pre>
<p>如果字符串至少包含一个<code>a</code>、<code>b</code>和<code>c</code>匹配。</p>
<p>但正如你所看到的,这并不是正则表达式真正擅长的。</p>
<p>我会这么做的:</p>
<pre><code>if all(char in mystr for char in "abc"):
# do something
</code></pre>
<p>检查速度:</p>
<pre><code>>>> timeit.timeit(stmt='chars.issubset("bracket");chars.issubset("notinhere")',
... setup='chars=set("abc")')
1.3560583674019995
>>> timeit.timeit(stmt='all(char in "bracket" for char in s);all(char in "notinhere" for char in s)',
... setup='s="abc"')
1.4581878714681409
>>> timeit.timeit(stmt='r.match("bracket"); r.match("notinhere")',
... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)")')
1.0582279123082117
</code></pre>
<p>嘿,看,雷鬼赢了!这甚至适用于较长的搜索字符串:</p>
<pre><code>>>> timeit.timeit(stmt='chars.issubset("bracketed");chars.issubset("notinhere")',
... setup='chars=set("abcde")')
1.4316702294817105
>>> timeit.timeit(stmt='all(char in "bracketed" for char in s);all(char in "notinhere" for char in s)',
... setup='s="abcde"')
1.6696223364866682
>>> timeit.timeit(stmt='r.match("bracketed"); r.match("notinhere")',
... setup='import re; r=re.compile("(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?:.*e)")')
1.1809254199004044
</code></pre>