2016-04-09 10 views
1

Ich habe einen regulären Ausdruck für url:Django Slug, ` W 'nicht erkennt koreanische + chinesisch

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

die folgende URL überein

/review_metas/2108/발견/24986/ 

die folgende URL tut nicht Match und ich frage mich warum?

/review_metas/2108/발견展/24986/ 

EDIT

Ich habe eigentlich

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

review.urls haben

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 Vorschlag auszuprobieren habe ich versucht, das Hinzufügen (?u) nach dem ^ in jedem der obigen zwei. Aber es führt zu Fehlern.

versuchte ich imaluengo Vorschlag

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

aber es funktioniert nicht ...

** EDIT **

Sorry für den falschen Anruf,

Es war wegen der clientseitigen Übereinstimmung der URL (Javascript regex), die nicht funktionierte.

Django behandelt es ziemlich gut beide Sprachen gleichzeitig.

+1

Versuchen Sie, eine Inline '(? U)': 'r '(? U) ^/review_metas/(? P \ d +)/(? P [- ~ \ w] +)/(? P \ d +)/$ '' –

Antwort

1

Vom python documentation:

\ w: Wenn die LOCALE und UNICODE-Flags nicht angegeben sind, passt zu jedem alphanumerischen Zeichen und den Unterstrich; Dies entspricht der Menge [a-zA-Z0-9_]. Mit LOCALE wird es mit der Menge [0-9_] plus allen Zeichen übereinstimmen, die für das aktuelle Gebietsschema als alphanumerisch definiert sind. Wenn UNICODE festgelegt ist, entspricht dies den Zeichen [0-9_] plus allem, was in der Unicode-Eigenschaftendatenbank als alphanumerisch klassifiziert ist.

Sie müssen nur die Flagge hinzuzufügen re.UNICODE für die Zeichenfolge in Unicode (als u'mystring' oder unicode(string)) zu arbeiten und zu konvertieren.

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

In Ihrem Beispiel:

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

Nur durch ein korrektes unicode Zeichenfolge und das Hinzufügen der re.UNICODE Flagge Ihres Parser funktioniert vorbei.


Ich weiß nicht, wie funktioniert Django handle the URLS intern (nie Django zuvor verwendet), aber wenn es keine Möglichkeit gibt, das Unicodeflag zu Django zur Verfügung stellen kann, können Sie Ihre Slug Muster \w+ mit [^/]+ ersetzen.

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

Es gelesen als anything but '/'.

0

verwenden:

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

Verwendung re.findall (Muster, Schnur, flags = re.U) oder nur re.findall (Muster, Schnur, re.U)

Sie werden, wenn Sie mit dem gleichen Problem beschäftigen muss jede Sprache mit nicht-kanonischen lateinischen Buchstaben parsen (zB Tschechisch, Russisch oder Chinesisch).

Verwandte Themen