【问题标题】:Python code to use a regular expression to make sure a string is alphanumeric plus . - _使用正则表达式来确保字符串是字母数字加的 Python 代码。 - _
【发布时间】:2026-01-07 04:40:01
【问题描述】:

虽然我认为应该很简单(如果你有任何 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:

但这似乎不起作用......

【问题讨论】:

  • re.match() 不返回布尔值,它返回一个 MatchObject,它“总是有一个布尔值 True”,或者 None。
  • 使用== True 总是不好的。它充其量是多余的,在这种情况下,它是行不通的。
  • 您真的认为(例如)---.___ 是有效匹配吗?

标签: python regex alphanumeric


【解决方案1】:

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(...)

【讨论】:

    【解决方案2】:

    切勿在比较中使用== True== False。许多类型已经有一个 bool 等效项,您应该使用它来代替:

    if re.match("^[a-zA-Z0-9_.-]+$", username):
    

    【讨论】:

      【解决方案3】:

      也可以稍微缩短为:

      if re.match(r'^[\w.-]+$', username):
      

      【讨论】:

        【解决方案4】:

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

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

        3) 用户名​​不得:

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

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

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

        【讨论】:

          【解决方案5】:

          我在我的 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!"
          

          【讨论】:

            【解决方案6】:

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

            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() 的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序无需担心编译正则表达式。

            【讨论】: