2016-04-09 7 views
1

Ben url için düzenli ifade var çin + kore algılamaz:Django salyangozdur ` w`

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

aşağıdaki url yapar maç

/review_metas/2108/발견/24986/ 

aşağıdaki url değil yapar maç ve nedenini merak ediyorum?

/review_metas/2108/발견展/24986/ 

Aslında

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

review.urls

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' 
    ), 

WIKTOR önerisini denemek için var olan

DÜZENLEME, benekleyerek çalıştı Yukarıdaki iki öğenin her birinde ^'dan sonra. Ancak hatalarla sonuçlanır.

Ben imaluengo önerisini

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

ama çalışmıyor ... denedik

** DÜZENLEME, sahte arama için **

Maalesef

It çalışmayan url (javascript regex) istemci tarafında eşleme nedeniyle oldu.

Django, iki dili de aynı anda gayet iyi işler.

+1

Satır içi (? U) ':' r '(? U) ^/review_metas/(? P \ d +)/(? P [- ~ \ w] +)/(? p d + \)/$ ' ' –

cevap

1

:

w \

: LOCALE ve UNICODE bayrakları belirtilmemiş zaman , herhangi bir alfasayısal karakter ve alt çizgi eşleşir; Bu, [a-zA-Z0-9_] kümesine eşdeğerdir. LOCALE ile, [0-9_] kümesinin yanı sıra mevcut yerel ayar için alfa sayısal olarak tanımlanan herhangi bir karakterle eşleşir. UNICODE ayarlanmışsa, bu karakterler [0-9_] artı Unicode karakter özellikleri veritabanında alfanümerik olarak sınıflandırılmış olanlarla eşleşir. o iş ve (u'mystring' veya unicode(string) gibi) unicode dizesi dönüştürmek için

sadece bayrak re.UNICODE eklemeniz gerekir.

>>> 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'] 
sizin örnekte

:
>>> 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' 

Sadece uygun unicode dize geçirerek ve ayrıştırıcı gayet iyi çalışıyor re.UNICODE işaretini ekleyerek.


içeriden Django handle the URLS nasıl yaptığını bilmiyorum (daha önce Django hiç kullanılmamış), ancak Django'ya unicode bayrağı sağlayabilir yolu yoktur, sen [^/]+ ile sülük deseni \w+ yerini alabilir.

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

anything but '/'.

0

bunu kullanın: python documentation itibaren

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

kullanım re.findall (desen, dize, bayraklar = re.U) ya da sadece re.findall (desen, dize, re.U)

Sen eğer aynı sorunla başa çıkmak olacak herhangi bir dili kanonik olmayan latin harflerle (yani Çek, Rusça veya Çince) ayrıştırmak zorundadır.