Django中的正则表达式,用于带%或的URL&

2024-10-02 16:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个URL,它要么是united-states/boulder-21781/tool-&-anchor/mulligan-21/。假设最佳策略是对amp;进行编码,则url将更改为united-states/boulder-21781/tool-%26-anchor/mulligan-21/

我试图编写一个url conf来接受它,但是我使用的regex不起作用。我有:

    url(r'^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex'= '(?i)([\.\-\_\w]+)'}, 'view_tip_page', name='tip_page'),

我要添加什么来获取百分比?还是应该只包括;?在


Tags: url编码confpagetool策略regexunited
2条回答

好吧,目前没有办法让您在正则表达式中匹配%或{}。根据是否编码,您需要将其中一个添加到正则表达式中的character类中,并且它应该匹配。在

我可以把它改成如下:

r'(?i)^%(regex)s/%(regex)s-(\d+)/%(regex)s/%(regex)s-(\d+)/$' % {'regex': r'([-.%\w]+)'}

并证明其有效:

^{pr2}$

关于regex的一些评论:

(?i)实际上没有做任何事情,因为您使用的是\w,它已经匹配了大小写。如果您确实想使用(?i),我会将它从替换字符串移到格式字符串('(?i)...' % {'regex': '...'}而不是'...' % {'regex': '(?i)...'}),否则它将出现多次。在

注意字符类从[\.\-\_\w]改为[-.%\w],这是因为下划线包含在\w中,如果连字符出现在字符类的开头,则不需要转义连字号,并且不需要转义字符类中的.。在

而且,\w确实匹配数字,所以从技术上来说,为了匹配像boulder-21781这样的东西,您可以使用%(regex)s而不是{},但我不想改变这一点,以防它有意添加一些额外的格式验证。在

我的第一个建议是不要这样做。正如您自己所演示的,并不是每个人都知道&是URI中第一个?之前的一个完全有效的字符,您肯定会遇到麻烦。它看起来也很难看,更难输入,而且比and,甚至是{}更刺耳。话虽如此,如果你真的想把它放在那里,就把它放在character类里。在

与您的问题无关,您构建正则表达式的方式很奇怪;您没有捕获路径的任何部分供视图使用。您还包括了四次(?i)全局修饰符,并指定了_,它已经是\w的一部分。我不知道,我希望

r'(?i)(?P<country>[.\w-]+)/(?P<city>[.\w-]+)-(?P<cityno>[\d+])/...etc...

但也许我遗漏了什么。在

相关问题 更多 >