【问题标题】:Python3 using re.match to check if password hold certain charactersPython3 使用 re.match 检查密码是否包含某些字符
【发布时间】:2013-04-01 14:28:42
【问题描述】:

如果用户输入的密码与a-z,A-Z,0-9,_,- 匹配,我将尝试返回用户输入的密码,否则将在 try 子句中执行 ValueError。这是我的代码行,它似乎不起作用,因为它几乎允许 (?.,@#$%^*)

return re.match('^[A-Za-z0-9_-]*$',password)

【问题讨论】:

  • define 几乎允许任何事情 ...您认为不应该匹配的到底是什么?
  • 试试这个:^[?!A-Za-z0-9_-]*$

标签: python regex match


【解决方案1】:

使用 Kleene 闭包,您可以将空字符串作为正确密码。您可以使用+ 特殊字符匹配一个重复的有效字符:

def validate(password):
    match = re.match('^[a-z0-9_-]+$', password, re.I)
    if match is not None:
        return password
    else:
        raise ValueError

【讨论】:

  • 看他的regex我觉得_-也是可以的。
  • 嗯,我不知道正则表达式语法中的* 被称为“Kleene 闭包”或"Kleene star",或者它来自数学符号。每天学些新东西。也不是Kleene X。 :-)
  • @AshwiniChaudhary 是的,但是 OP 明确说 它匹配 az,AZ,0-9,这似乎比没有给出的代码行更具体他期望的结果。
  • @BenHoyt 我在计算理论课上对它太熟悉了。
  • 抱歉是 _ 和 - 也应该被允许
【解决方案2】:

大纲

使用集合和集合减法可能是一种更简单的解决方案。

代码

from string import ascii_letters, digits

PASSWORD_SET = set(ascii_letters + digits + "_-")

def has_only_password_letters(candidate):
    return not(set(candidate) - PASSWORD_SET)

或:

def has_only_password_letters(candidate):
    return all(c in PASSWORD_SET for c in candidate)

测试

>>> def test_password(password):
...     if has_only_password_letters(password):
...         print "Okay: ", password
...     else:
...         print "Nuh-uh: ", password
... 
>>> test_password("asdasd123123")
Okay:  asdasd123123
>>> test_password("asdasd123123!!!")
Nuh-uh:  asdasd123123!!!

【讨论】:

    【解决方案3】:

    这是使用isalnum 的非正则表达式解决方案:

    for c in password:
        if not (c.isalnum() or c in ['_', '-']):
            raise ValueError('Invalid character in password')
    

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2018-05-01
      • 2014-05-07
      • 2015-03-15
      • 2011-03-31
      • 2015-01-31
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多