我需要创建一个可以使用这个URL的URL模式:
mysite.com/blog/12/بلاگ-مثال它包含utf-8字符,所以我尝试使用\X。
re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[\X.*]+)/$', views.single_blog, name='single_blog')但没起作用。我也不知道原因。也许只是因为我不擅长判断力。因此,我尝试了一种不同的模式,使用.*来接受任何东西:
re_path(r'^blog/?P<blog_id>[\d+]+/(?P<slug>[.*]+)/$', views.single_blog, name='single_blog')但这也不起作用,我得到:
当前的路径blog/12/بلاگ-مثال与其中任何一条都不匹配。
所以,正如我提到的,我不擅长正则表达式,有什么正确的方法来解决这个问题呢?
现在是说现在我有两个问题或regex是唯一方法的正确时机吗?
发布于 2018-06-29 20:39:53
您的匹配方法不起作用,因为\X不支持Python re,[.*]+与1+点或星号匹配,但不匹配任何字符(因为将.*放入[...]字符类中,它们表示文字符号,而不是特殊字符)。
此外,[\d+]+也是一个字符类,匹配任何数字或+,1次或更多次,因此也存在一个问题。
您可以使用[^/]否定字符类来匹配除/以外的任何字符。
r'^blog/(?P<blog_id>\d+)/(?P<slug>[^/]+)/?$'详细信息
^ -输入的开始blog/ -一个文字子带(?P<blog_id>\d+) -组"blog_id":1+数字/ -a /(?P<slug>[^/]+) -组“段塞”:/以外的1+字符/? -一个可选的/$ -字符串的末端。这里是regex演示 (注意,阿拉伯脚本中的字符在那里不起作用)。
发布于 2018-06-30 16:34:03
现在是时候说我有两个问题..。
事实上,你已经为这个任务选择了正确的工作。
另一个答案似乎是正确的,但不能容忍在里面加上波斯语。我发布这个答案是为了解释为什么您自己的regex不能像预期的那样工作。
?P<blog_id>[\d+]+您可能在这里指的是一个命名组,与稍后在regex中使用的组相同。您忽略了开头和结尾括号:(?P<blog_id>[\d+]+)。[\d+]也意味着一个由数字和+组成的字符类。您需要删除+:(?P<blog_id>[0-9]+)
(?P<slug>[\X.*]+)结构是好的,它应该是,但字符类不是。\X在字符类中没有特殊的意义,更不用说它的re模块也不支持它了。.*也不例外。在字符类中,几乎所有特殊的标记都按字面处理。
因此,[\X.*]与X、.或星号*匹配。您需要将其更改为更一般的内容,如[^/]+,这意味着匹配到第一个斜杠(=匹配除正斜杠外的任何内容)。
https://stackoverflow.com/questions/51109014
复制相似问题