Trước hết, nó không phải là một lỗi nhưng một tính năng well documented in the docs:
[]
Được sử dụng để chỉ ra một tập hợp các ký tự. Trong một bộ:
Phạm vi ký tự có thể được chỉ định bằng cách cho hai ký tự và tách chúng bằng dấu '-', ví dụ [az] sẽ khớp với bất kỳ chữ cái ASCII thường, [0-5] [0-9] sẽ khớp với tất cả các số có hai chữ số từ 00 đến 59 và [0-9A-Fa-f] sẽ khớp với bất kỳ chữ số thập lục phân nào. Nếu - được thoát (ví dụ [a-z]) hoặc nếu nó được đặt làm ký tự đầu tiên hoặc cuối cùng (ví dụ: [a-]), ký tự đó sẽ khớp với chữ '-'.
Vì vậy, sử dụng -
giữa hai literals sẽ đánh giá regex mà như một loạt nhân vật:
re.compile("[a-0]+")
>> error: bad character range
re.findall("[.-_]+", "asdasd-asdasdad._?asdasd-")
>> ['._?']
Như bạn thấy, trăn sẽ luôn interperet -
như một chỉ số phạm vi khi được sử dụng giữa các nhân vật trong bộ ký tự.
Vì nó là (cũng) được nêu trong các tài liệu, tránh một tuyên bố phạm vi được thực hiện bằng cách thoát khỏi sự -
với \-
hoặc đặt nó như là người đầu tiên hoặc cuối cùng chữ trong bộ ký tự []
Nếu bạn muốn chụp phạm vi nhân vật bao gồm -
, sau đó thử:
re.findall("[.-_\-]+", "asdasd-asdasdad._?asdasd-")
>> ['-', '._?', '-']
Lưu ý:\w
bằng [a-zA-Z0-9_]
khi LOCALE và UNICODE cờ không được thiết lập. Vì vậy, bạn không cần phải khai báo _
lại
Và trong tình huống của bạn:
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')
Ngoài việc sử dụng -
, nếu bạn đang sử dụng mặc định Django Tên phong cách, sau đó @ navneet35371 là đúng về bộ ký tự hợp lệ. Bạn có thể thay đổi nhân vật regex của bạn thiết lập để bao gồm @
và +
và sử dụng
url(r'^user/(?P<username>[\[email protected]+-]+)/foo', 'myapp.views.foo')
Cảm ơn bạn đã trả lời câu hỏi này. Các câu trả lời khác cho tôi biết cách bao gồm dấu gạch ngang trong regex. Đó không phải là câu hỏi. Đó là về việc khớp với bất kỳ tên người dùng hợp lệ nào. – guettli