<p>如果只有一个参数可以有斜杠,那么可以通过指定regex来解决问题,其中只允许一个捕获组具有斜杠。例如:</p>
<pre class="lang-regex prettyprint-override"><code>^datavore/(?P<configuration>[\w\d\.\-_]+)/(?P<dataset>.*)/(?P<varname>[\w\d\.\-_]+)/(?P<region>[a-z-A-Z\_]+)/(?P<date_range>[\w\d\.\-_]+)/filelist/$
</code></pre>
<p><code>datavore/some-config/dataset/subdataset/varname/region/date-range/filelist/</code>将生成匹配组的下一个值:</p>
^{pr2}$
<p>如果多个组中可以有斜杠,那么没有准确的方法来正确地匹配它们而不使用路径中的额外文本。路径中包含额外文本的示例解决方案:</p>
<pre class="lang-regex prettyprint-override"><code>^datavore/__conf__/(?P<configuration>.*)/__dataset__/(?P<dataset>.*)/__varname__/(?P<varname>.*)/__region__/(?P<region>[a-z-A-Z\_]+)/__date_range__/(?P<date_range>.*)/filelist/$
</code></pre>
<pre class="lang-plaintext prettyprint-override"><code>670 steps to match
datavore/__conf__/conf/subconf/__dataset__/dataset/subdataset/__varname__/varname/subvarname/__region__/region/__date_range__/date-range/filelist/
configuration [18-30] `conf/subconf`
dataset [43-61] `dataset/subdataset`
varname [74-92] `varname/subvarname`
region [104-110] `region`
date_range [126-136] `date-range`
</code></pre>
<p>注意使用<code>/__dataset__/</code>而不是简单的<code>dataset</code>,您可能希望用户拥有以<code>dataset</code>开头的数据集的值。这将导致问题:</p>
<pre class="lang-plaintext prettyprint-override"><code>^datavore/conf/(?P<configuration>.*)/dataset/(?P<dataset>.*)/varname/(?P<varname>.*)/region/(?P<region>[a-z-A-Z\_]+)/date_range/(?P<date_range>.*)/filelist/$
</code></pre>
<pre class="lang-plaintext prettyprint-override"><code>datavore/conf/conf-val/dataset/dataset/dataset-val/varname/varname-val/subvarname-val/region/region-val/date_range/date-range-val/filelist/
654 steps to match
configuration [14-30] `conf-val/dataset` // THIS SEEMS TO BE WRONG. We wanted this to be `conf-val`
dataset [39-50] `dataset-val` // THIS SEEMS TO BE WRONG. We wanted this to be `dataset/dataset-val`
varname [59-85] `varname-val/subvarname-val`
region [93-103] `region-val`
date_range [115-129] `date-range-val`
</code></pre>
<p>实际解决方案在很大程度上取决于捕获组的可能值</p>
<p>如果您将此路径用作API端点,那么我建议您直接转储此方法,而使用GET参数</p>