<p>通常,通过<code>-p</code>参数传递到<code>unittest</code>的所有内容都通过<a href="https://github.com/python/cpython/blob/9ce361d3bb15cf49b82fa03e3e593d7cbd8ee1ff/Lib/unittest/loader.py#L380" rel="nofollow noreferrer">^{<cd3>} method</a>处理,然后调用函数链<code>fnmatch()</code>→ <code>fnmatchcase()</code>→ <code>_compile_pattern()</code>→ <code>translate()</code>来自<a href="https://docs.python.org/3.8/library/fnmatch.html" rel="nofollow noreferrer">^{<cd8>} library</a></p>
<p><strong>函数<code>translate()</code>将原始<code>-p</code>参数转换为正则表达式,然后用于名称匹配。</strong></p>
<p><code>fnmatch()</code>函数的文档说明:</p>
<pre><code>Patterns are Unix shell style:
* matches everything
? matches any single character
[seq] matches any character in seq
[!seq] matches any char not in seq
</code></pre>
<p>据我所见,这就是它所能做到的程度<strong>所有其他字符都将转义,以便按字面进行匹配</strong></p>
<p><strong>示例:</strong>我将regex<code>a|b</code>作为模式传递。<code>translate()</code>函数返回形式为<code>(?s:p\|m)\Z</code>的最终正则表达式。管道字符在那里被转义</p>
<p>如果您特别好奇,请查看<code>fnmatch</code>lib的<code>translate()</code>函数<a href="https://github.com/python/cpython/blob/9ce361d3bb15cf49b82fa03e3e593d7cbd8ee1ff/Lib/fnmatch.py#L74" rel="nofollow noreferrer">here</a>——如果您想知道将“glob-like”模式转换为最终正则表达式的确切过程</p>