我有一个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同时处理两种语言都很好。
答案 0 :(得分:1)
<强> \ 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+)/$'