Django slug,`\ w`没有检测到韩语+中文

时间:2016-04-09 08:24:24

标签: python regex django

我有一个url的正则表达式:

/review_metas/2108/발견/24986/

以下网址匹配

/review_metas/2108/발견展/24986/

以下网址匹配,我想知道为什么?

url(r'^review/',
         include('review.urls', namespace='review', app_name='review')),

修改

我实际上已经

url( r'^review_metas/(?P<review_meta_id>\d+)/(?P<slug>[-~\w]+)/(?P<review_thread_id>\d+)/$', views.review.review_meta, name='review_meta_thread' ),

review.urls

(?u)

为了尝试使用Wiktor的建议,我尝试在^之后的上述两个中添加r'^/review_metas/(?P<review_meta_id>\d+)/(?P<slug>[^/]+)/(?P<review_thread_id>\d+)/$'。但它会导致错误。

我尝试了imaluengo的建议

profile-form.html

但它不起作用......

**编辑**

对不起来电,

这是由于客户端匹配的url(javascript regex)无法正常工作。

Django同时处理两种语言都很好。

3 个答案:

答案 0 :(得分:1)

来自python documentation

  

<强> \ W :       如果未指定LOCALE和UNICODE标志,则匹配任何字母数字字符和下划线;这相当于集合[a-zA-Z0-9_]。对于LOCALE,它将匹配集[0-9_]以及任何字符被定义为当前语言环境的字母数字。如果设置了UNICODE,这将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的字符。

您只需添加标记re.UNICODE即可使其工作,并将字符串转换为unicode(u'mystring'unicode(string))。

>>> re.findall(r'\w+', '/review_metas/2108/발견/24986/')
['review_metas', '2108', '24986']

>>> re.findall(r'\w+', u'/review_metas/2108/발견/24986/', re.UNICODE)
[u'review_metas', u'2108', u'\ubc1c\uacac', u'24986']

在你的例子中:

>>> expr = r'^/review_metas/(?P<review_meta_id>\d+)/(?P<slug>[-~\w]+)/(?P<review_thread_id>\d+)/$'
>>> url = u'/review_metas/2108/발견/24986/'

>>> re.match(expr, url)
None

>>> f = re.match(expr, url, re.UNICODE)
>>> f
<_sre.SRE_Match at 0x7f2e08dd8620>
>>> f.group('slug')
u'\ubc1c\uacac'

只需传递正确的unicode字符串并添加re.UNICODE标记,您的解析器就可以正常工作。

我不知道Django handle the URLS内部是怎么做的(之前从未使用过Django),但是如果你无法向Django提供unicode标志,你可以替换你的 slug 模式\w+[^/]+

r'^/review_metas/(?P<review_meta_id>\d+)/(?P<slug>[^/]+)/(?P<review_thread_id>\d+)/$'

读作anything but '/'

答案 1 :(得分:1)

使用     re.findall(pattern,string,flags = re.U) 要不就     re.findall(pattern,string,re.U)

如果您必须使用非规范拉丁字母(即捷克语,俄语或中文)解析任何语言,您将处理同样的问题。

答案 2 :(得分:0)

使用此:

r'^/review_metas/(?P<review_meta_id>\d+)/(?P<slug>.*)/(?P<review_thread_id>\d+)/$'