7

尽管我认为它应该很简单,但我查看并搜索并找不到我需要的东西(如果你有任何 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:

但这似乎没有做这项工作......

4

6 回答 6

19

re.match不返回布尔值;MatchObject它在匹配或不匹配时返回 a 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在这种情况下进行检查,可以进一步缩短为 just if re.match(...)

于 2010-03-25T21:56:22.633 回答
5

永远不要使用== True== False比较。许多类型已经有一个 bool 等效项,您应该使用它来代替:

if re.match("^[a-zA-Z0-9_.-]+$", username):
于 2010-03-25T21:57:13.257 回答
2

也可以稍微缩短到:

if re.match(r'^[\w.-]+$', username):
于 2010-03-26T07:28:03.423 回答
1

我认为这是一个有效的用户名:
1​​)用户名必须是 6-30 个字符长
2)用户名只能包含:

  • 大写和小写字母
  • 0-9 的数字和
  • 特殊的角色 _ - 。

3) 用户名​​不得:

  • 以字符 _ - 开始或结束。

  • 有多个连续字符 _ - 。里面

这将是使用示例:
if re.match(r'^(?![-._])(?!.*[_.-]{2})[\w.-]{6,30}(?<![-._])$',username) is not None:

于 2017-07-02T18:36:19.133 回答
0

如果您要使用许多正则表达式,您可以编译它以提高速度(或可读性)

import re 
ALPHANUM=re.compile('^[a-zA-Z0-9_.-]+$')

for u in users:
    if ALPHANUM.match(u) is None:
        print "invalid"

文档

最新模式的编译版本传递给或被缓存re.match(),因此一次只使用几个正则表达式的程序不必担心编译正则表达式。re.search()re.compile()

于 2010-03-26T07:37:45.783 回答
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!"
于 2013-02-28T01:39:12.750 回答