到目前为止,队友已将此代码用于用户名的网址格式:
# urls.py
urlpatterns = patterns('...',
url(r'^user/(?P<username>[.-_\w]+)/foo', 'myapp.views.foo'),
....
存在隐藏的错误:如果用户名包含-
,则撤消将失败,因为正则表达式模式[.-_
的开头意味着&#34;所有字符从.
到_
&#34;
可以使用哪种模式来匹配所有有效用户名?
PS:如果你想匹配django中所有可能的用户名,我想将-
符号添加到正则表达式是不够的。
答案 0 :(得分:8)
根据我在AbstractUser
模型中看到的内容,我认为用于获取用户名的更好的正则表达式是(?P<username>[\w.@+-]+)
。
答案 1 :(得分:5)
我认为您不应该在网址格式中添加任何用户名验证。将验证放在一个地方 - 首次创建帐户的地方。
你应匹配用户提供的任何内容,并将其传递给安全数据库函数以查找用户名,如果不存在则失败。
因此,在您的网址模式中,让浏览器发送任何非空的内容,并依靠您非常智能的数据库告诉您之前认为有效的内容。
url(r'^user/(?P<username>.+)/foo$', 'myapp.views.foo'),
另外,请注意最后的“$”。
答案 2 :(得分:4)
您可以将连字符移动到字符类的开头
[-.\w]
或者你可以用反斜杠
来逃避它[.\-\w]
注意我删除了下划线,因为它包含在\w
中。我还假设您只想接受.
,-
和\w
,并且您不希望接受.
到{{1}的所有字符}。该范围包含_
等字符,因此您可能需要检查所有用户名是否与新的正则表达式匹配。
答案 3 :(得分:4)
您可以使用以下方式:
[-.\w]
(最左边使用-
)
或 [.\-\w]
(-
在任何地方使用反斜杠)
或 [.\w-]
(-
最右边使用)
如果您在任何特殊字符(在正则表达式特殊字符中使用)之前使用特殊字符,则最佳使用 \
(反斜杠)。
为了最好地使用,您的正则表达式将为^user/(?P<username>[.\-_\w]+)/foo
答案 4 :(得分:0)
首先,它不是错误,而是功能well documented in the docs:
<强> [] 强>
用于表示一组字符。在一组:
字符范围可以通过给出两个字符并用' - '分隔来表示,例如[az]将匹配任何小写的ASCII字母,[0-5] [0-9]将匹配所有两个字符 - 数字从00到59,[0-9A-Fa-f]将匹配任何十六进制数字。 如果 - 被转义(例如[a-z])或者如果它被放置为第一个或最后一个字符(例如[a-]),它将匹配文字“ - ”。
因此,在两个文字之间使用-
会将该正则表达式评估为字符范围:
re.compile("[a-0]+")
>> error: bad character range
re.findall("[.-_]+", "asdasd-asdasdad._?asdasd-")
>> ['._?']
如您所见,当在字符集中的字符之间使用时,python将始终将-
作为范围指示符插入。
正如文档(也)在文档中所述,避免范围声明是通过使用-
转义\-
或将其作为字符集中{{1}的第一个或最后一个文字来完成的。 1}}
如果要捕获包含[]
的字符范围,请尝试:
-
注意:当未设置LOCALE和UNICODE标志时, re.findall("[.-_\-]+", "asdasd-asdasdad._?asdasd-")
>> ['-', '._?', '-']
等于\w
。因此,您无需再次声明[a-zA-Z0-9_]
在你的情况下:
_
除了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')
用法之外,如果您使用的是默认的Django用户名样式,那么@ navneet35371对于有效的字符集是正确的。您可以更改正则表达式字符集以包含-
和@
并使用
+