我查看并搜索过,找不到我需要的东西,虽然我觉得它应该很简单(如果你有任何Python经验,我没有)。
给定一个字符串,我想在Python中验证它只包含字母数字字符:a-zA-Z0-9
和.
_
-
的示例:
接受:
bill-gates
Steve_Jobs
Micro.soft
拒绝:
Bill gates
- 不允许空格
me@host.com
- @不是字母数字
我正在尝试使用:
if re.match("^[a-zA-Z0-9_.-]+$", username) == True:
但这似乎没有成功......
答案 0 :(得分:17)
re.match
不返回布尔值;它会在匹配项上返回MatchObject
,或在不匹配时返回None
。
>>> re.match("^[a-zA-Z0-9_.-]+$", "hello")
<_sre.SRE_Match object at 0xb7600250>
>>> re.match("^[a-zA-Z0-9_.-]+$", " ")
>>> print re.match("^[a-zA-Z0-9_.-]+$", " ")
None
所以,你不应该做re.match(...) == True
;相反,在这种情况下,您应该检查re.match(...) is not None
,这可以进一步缩短为if re.match(...)
。
答案 1 :(得分:4)
不要在比较中使用== True
或== False
。许多类型已经有一个bool等价物,你应该使用它:
if re.match("^[a-zA-Z0-9_.-]+$", username):
答案 2 :(得分:2)
答案 3 :(得分:1)
我认为这是有效的用户名:
1)用户名长度必须为6-30个字符
2)用户名只能包含:
3)用户名可能不会:
开头或结束字符_ - 。
有多个序列字符_ - 。内部
这是用法的例子:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:
答案 4 :(得分:0)
如果要使用许多正则表达式,可以将其编译为速度(或可读性)
import re
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$')
for u in users:
if ALPHANUM.match(u) is None:
print "invalid"
来自the docs:
传递给re.match()
,re.search()
或re.compile()
的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式。
答案 5 :(得分:0)
我在utils类中以这种方式进行验证:
def valid_re(self, s, r):
reg = re.compile(r)
return reg.match(s)
然后我调用utils实例,并以这种方式检查:
if not utils.valid_re(username, r'^[a-zA-Z0-9_.-]+$'):
error = "Invalid username!"