Python代码使用正则表达式来确保字符串是字母数字加。 - _

时间:2010-03-25 21:51:53

标签: python regex alphanumeric

我查看并搜索过,找不到我需要的东西,虽然我觉得它应该很简单(如果你有任何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:

但这似乎没有成功......

6 个答案:

答案 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)用户名只能包含:

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

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!"