evennia/docs/5.x/_modules/fnmatch.html
2025-07-01 10:01:48 +02:00

295 lines
No EOL
31 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>fnmatch &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../_static/nature.css?v=245aff17" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/documentation_options.js?v=c6e86fd7"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">fnmatch</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for fnmatch</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;Filename matching with shell patterns.</span>
<span class="sd">fnmatch(FILENAME, PATTERN) matches according to the local convention.</span>
<span class="sd">fnmatchcase(FILENAME, PATTERN) always takes case in account.</span>
<span class="sd">The functions operate by translating the pattern into a regular</span>
<span class="sd">expression. They cache the compiled regular expressions for speed.</span>
<span class="sd">The function translate(PATTERN) returns a regular expression</span>
<span class="sd">corresponding to PATTERN. (It does not compile it.)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">posixpath</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">functools</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;filter&quot;</span><span class="p">,</span> <span class="s2">&quot;fnmatch&quot;</span><span class="p">,</span> <span class="s2">&quot;fnmatchcase&quot;</span><span class="p">,</span> <span class="s2">&quot;translate&quot;</span><span class="p">]</span>
<div class="viewcode-block" id="fnmatch">
<a class="viewcode-back" href="../api/evennia.utils.evmenu.html#evennia.utils.evmenu.fnmatch">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">fnmatch</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pat</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Test whether FILENAME matches PATTERN.</span>
<span class="sd"> Patterns are Unix shell style:</span>
<span class="sd"> * matches everything</span>
<span class="sd"> ? matches any single character</span>
<span class="sd"> [seq] matches any character in seq</span>
<span class="sd"> [!seq] matches any char not in seq</span>
<span class="sd"> An initial period in FILENAME is not special.</span>
<span class="sd"> Both FILENAME and PATTERN are first case-normalized</span>
<span class="sd"> if the operating system requires it.</span>
<span class="sd"> If you don&#39;t want this, use fnmatchcase(FILENAME, PATTERN).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normcase</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">pat</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normcase</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="k">return</span> <span class="n">fnmatchcase</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pat</span><span class="p">)</span></div>
<span class="nd">@functools</span><span class="o">.</span><span class="n">lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">32768</span><span class="p">,</span> <span class="n">typed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_compile_pattern</span><span class="p">(</span><span class="n">pat</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pat</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
<span class="n">pat_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">pat</span><span class="p">,</span> <span class="s1">&#39;ISO-8859-1&#39;</span><span class="p">)</span>
<span class="n">res_str</span> <span class="o">=</span> <span class="n">translate</span><span class="p">(</span><span class="n">pat_str</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">res_str</span><span class="p">,</span> <span class="s1">&#39;ISO-8859-1&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">res</span> <span class="o">=</span> <span class="n">translate</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">res</span><span class="p">)</span><span class="o">.</span><span class="n">match</span>
<span class="k">def</span><span class="w"> </span><span class="nf">filter</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">pat</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Construct a list from those elements of the iterable NAMES that match PAT.&quot;&quot;&quot;</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">pat</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normcase</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">_compile_pattern</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span> <span class="ow">is</span> <span class="n">posixpath</span><span class="p">:</span>
<span class="c1"># normcase on posix is NOP. Optimize it away from the loop.</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
<span class="k">if</span> <span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
<span class="k">if</span> <span class="n">match</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normcase</span><span class="p">(</span><span class="n">name</span><span class="p">)):</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span><span class="w"> </span><span class="nf">fnmatchcase</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pat</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Test whether FILENAME matches PATTERN, including case.</span>
<span class="sd"> This is a version of fnmatch() which doesn&#39;t case-normalize</span>
<span class="sd"> its arguments.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">_compile_pattern</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="k">return</span> <span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">translate</span><span class="p">(</span><span class="n">pat</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Translate a shell PATTERN to a regular expression.</span>
<span class="sd"> There is no way to quote meta-characters.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">STAR</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<span class="n">parts</span> <span class="o">=</span> <span class="n">_translate</span><span class="p">(</span><span class="n">pat</span><span class="p">,</span> <span class="n">STAR</span><span class="p">,</span> <span class="s1">&#39;.&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">_join_translated_parts</span><span class="p">(</span><span class="n">parts</span><span class="p">,</span> <span class="n">STAR</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_translate</span><span class="p">(</span><span class="n">pat</span><span class="p">,</span> <span class="n">STAR</span><span class="p">,</span> <span class="n">QUESTION_MARK</span><span class="p">):</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">add</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">append</span>
<span class="n">i</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">pat</span><span class="p">)</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">pat</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
<span class="c1"># compress consecutive `*` into one</span>
<span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">res</span><span class="p">)</span> <span class="ow">or</span> <span class="n">res</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">STAR</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="n">STAR</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="s1">&#39;?&#39;</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="n">QUESTION_MARK</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="s1">&#39;[&#39;</span><span class="p">:</span>
<span class="n">j</span> <span class="o">=</span> <span class="n">i</span>
<span class="k">if</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">pat</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span>
<span class="n">j</span> <span class="o">=</span> <span class="n">j</span><span class="o">+</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">pat</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;]&#39;</span><span class="p">:</span>
<span class="n">j</span> <span class="o">=</span> <span class="n">j</span><span class="o">+</span><span class="mi">1</span>
<span class="k">while</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">pat</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">&#39;]&#39;</span><span class="p">:</span>
<span class="n">j</span> <span class="o">=</span> <span class="n">j</span><span class="o">+</span><span class="mi">1</span>
<span class="k">if</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="n">n</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">[&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="n">pat</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="p">]</span>
<span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">stuff</span><span class="p">:</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="n">stuff</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">chunks</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">2</span> <span class="k">if</span> <span class="n">pat</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;!&#39;</span> <span class="k">else</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">pat</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span>
<span class="k">if</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">chunks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pat</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">k</span><span class="p">])</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">k</span><span class="o">+</span><span class="mi">1</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">k</span><span class="o">+</span><span class="mi">3</span>
<span class="n">chunk</span> <span class="o">=</span> <span class="n">pat</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">j</span><span class="p">]</span>
<span class="k">if</span> <span class="n">chunk</span><span class="p">:</span>
<span class="n">chunks</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">chunks</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s1">&#39;-&#39;</span>
<span class="c1"># Remove empty ranges -- invalid in RE.</span>
<span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="k">if</span> <span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">][:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">del</span> <span class="n">chunks</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
<span class="c1"># Escape backslashes and hyphens for set difference (--).</span>
<span class="c1"># Hyphens that create ranges shouldn&#39;t be escaped.</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="s1">&#39;-&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\-&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">chunks</span><span class="p">)</span>
<span class="c1"># Escape set operations (&amp;&amp;, ~~ and ||).</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;([&amp;~|])&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">\1&#39;</span><span class="p">,</span> <span class="n">stuff</span><span class="p">)</span>
<span class="n">i</span> <span class="o">=</span> <span class="n">j</span><span class="o">+</span><span class="mi">1</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">stuff</span><span class="p">:</span>
<span class="c1"># Empty range: never match.</span>
<span class="n">add</span><span class="p">(</span><span class="s1">&#39;(?!)&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">stuff</span> <span class="o">==</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span>
<span class="c1"># Negated empty range: match any character.</span>
<span class="n">add</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">if</span> <span class="n">stuff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;!&#39;</span><span class="p">:</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="s1">&#39;^&#39;</span> <span class="o">+</span> <span class="n">stuff</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">elif</span> <span class="n">stuff</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;^&#39;</span><span class="p">,</span> <span class="s1">&#39;[&#39;</span><span class="p">):</span>
<span class="n">stuff</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="n">stuff</span>
<span class="n">add</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;[</span><span class="si">{</span><span class="n">stuff</span><span class="si">}</span><span class="s1">]&#39;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
<span class="k">assert</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span>
<span class="k">return</span> <span class="n">res</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_join_translated_parts</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">STAR</span><span class="p">):</span>
<span class="c1"># Deal with STARs.</span>
<span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">add</span> <span class="o">=</span> <span class="n">res</span><span class="o">.</span><span class="n">append</span>
<span class="n">i</span><span class="p">,</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">inp</span><span class="p">)</span>
<span class="c1"># Fixed pieces at the start?</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">STAR</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="c1"># Now deal with STAR fixed STAR fixed ...</span>
<span class="c1"># For an interior `STAR fixed` pairing, we want to do a minimal</span>
<span class="c1"># .*? match followed by `fixed`, with no possibility of backtracking.</span>
<span class="c1"># Atomic groups (&quot;(?&gt;...)&quot;) allow us to spell that directly.</span>
<span class="c1"># Note: people rely on the undocumented ability to join multiple</span>
<span class="c1"># translate() results together via &quot;|&quot; to build large regexps matching</span>
<span class="c1"># &quot;one of many&quot; shell patterns.</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="n">STAR</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="s2">&quot;.*&quot;</span><span class="p">)</span>
<span class="k">break</span>
<span class="k">assert</span> <span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">STAR</span>
<span class="n">fixed</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span> <span class="ow">and</span> <span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">STAR</span><span class="p">:</span>
<span class="n">fixed</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inp</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="n">fixed</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">fixed</span><span class="p">)</span>
<span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="s2">&quot;.*&quot;</span><span class="p">)</span>
<span class="n">add</span><span class="p">(</span><span class="n">fixed</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">add</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;(?&gt;.*?</span><span class="si">{</span><span class="n">fixed</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">i</span> <span class="o">==</span> <span class="n">n</span>
<span class="n">res</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<span class="k">return</span> <span class="sa">fr</span><span class="s1">&#39;(?s:</span><span class="si">{</span><span class="n">res</span><span class="si">}</span><span class="s1">)\Z&#39;</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">fnmatch</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>