擅长:python、mysql、java
<p>好吧,目前没有办法让您在正则表达式中匹配<code>%</code>或{<cd2>}。根据是否编码,您需要将其中一个添加到正则表达式中的character类中,并且它应该匹配。在</p>
<p>我可以把它改成如下:</p>
<pre><code>r'(?i)^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex': r'([-.%\w]+)'}
</code></pre>
<p>并证明其有效:</p>
^{pr2}$
<p>关于regex的一些评论:</p>
<p><code>(?i)</code>实际上没有做任何事情,因为您使用的是<code>\w</code>,它已经匹配了大小写。如果您确实想使用<code>(?i)</code>,我会将它从替换字符串移到格式字符串(<code>'(?i)...' % {'regex': '...'}</code>而不是<code>'...' % {'regex': '(?i)...'}</code>),否则它将出现多次。在</p>
<p>注意字符类从<code>[\.\-\_\w]</code>改为<code>[-.%\w]</code>,这是因为下划线包含在<code>\w</code>中,如果连字符出现在字符类的开头,则不需要转义连字号,并且不需要转义字符类中的<code>.</code>。在</p>
<p>而且,<code>\w</code>确实匹配数字,所以从技术上来说,为了匹配像boulder-21781这样的东西,您可以使用<code>%(regex)s</code>而不是{<cd14>},但我不想改变这一点,以防它有意添加一些额外的格式验证。在</p>