Prima di tutto, non è un bug ma una caratteristica well documented in the docs:
[]
Utilizzato per indicare un insieme di caratteri. In un set:
Gli intervalli di caratteri possono essere indicati dando due caratteri e separandoli con un '-', ad esempio [az] corrisponderà a qualsiasi lettera ASCII minuscola, [0-5] [0-9] sarà abbinare tutti i numeri a due cifre da 00 a 59 e [0-9A-Fa-f] corrisponderà a qualsiasi cifra esadecimale. Se - è sfuggito (ad esempio [a-z]) o se è collocato come primo o ultimo carattere (ad es. [A-]), corrisponderà a un valore letterale '-'.
Quindi, utilizzando -
tra due letterali valuterà che regex come un intervallo di caratteri:
re.compile("[a-0]+")
>> error: bad character range
re.findall("[.-_]+", "asdasd-asdasdad._?asdasd-")
>> ['._?']
Come si vede, pitone sarà sempre interperet -
come un indicatore serie se usato tra i caratteri del set di caratteri.
Come è (anche) ha dichiarato nei documenti, evitando una dichiarazione gamma è fatto da sfuggire al -
con \-
o ponendolo come il primo o l'ultimo letterale il set di caratteri []
Se si desidera catturare quel intervallo di caratteri tra cui -
, quindi provare:
re.findall("[.-_\-]+", "asdasd-asdasdad._?asdasd-")
>> ['-', '._?', '-']
Nota:\w
è uguale a [a-zA-Z0-9_]
quando LOCALE e UNICODE flag non sono impostati. Quindi non è necessario dichiarare _
nuovo
E per l'utente:
url(r'^user/(?P<username>[-.\w]+)/foo', 'myapp.views.foo')
url(r'^user/(?P<username>[.\w-]+)/foo', 'myapp.views.foo')
url(r'^user/(?P<username>[.\-\w]+)/foo', 'myapp.views.foo')
oltre l'uso -
, se si utilizza di default Django Nome utente styling, quindi @ navneet35371 è di destra circa il set di caratteri validi. Si può modificare il vostro personaggio regex impostato per includere @
e +
e utilizzare
url(r'^user/(?P<username>[\[email protected]+-]+)/foo', 'myapp.views.foo')
Grazie per questa risposta. Le altre risposte mi dicono come includere un trattino nella regex. Non è di questo che si tratta. Si tratta di abbinare qualsiasi nome utente valido. – guettli