Python正则表达式不允许字符仍被接受?

时间:2017-11-04 12:23:31

标签: python regex

a = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!£&*@#-_=+"
b = 0
username = input("Enter a username: ")
while b == 0:
    if len(username) < 6 or len(username) > 16:
        print("Incorrect length, try again.")
        break
    else:
        valid = re.search(a, username)
        if valid:
            print("Invalid characters entered, try again")
            break
        else:
            print("Username accepted")
            break

这是我的代码,用于检查用户输入的用户名是否适合某些参数,但它无法正常工作。问题是,当我运行它时,仍然接受输入但不在允许列表中的字符。

我该如何解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:0)

这里有四个错误:

  1. 您交换了validnot valid:因此,如果re.search(..)成功,您会在屏幕上写信用户名无效;
  2. 您不要求用户输入新用户名;
  3. 如果字符串包含无效字符,您就会收支平衡;
  4. 您的正则表达式会查找序列 'abcd...'(因此'a'后跟'b'等等。)
  5. 使用not并将查询放在循环中,可以轻松解决前三项:

    while b == 0:
        username = input("Enter a username: ")
        if len(username) < 6 or len(username) > 16:
            print("Incorrect length, try again.")
        else:
            if not re.search(a, username):
                print("Invalid characters entered, try again")
            else:
                print("Username accepted")
                break

    对于第二个你需要改变你的正则表达式。首先,通过指定单词组

    [a-z0-9A-Z!£&*@#_=+-]

    我们重复零次或多次:

    [a-z0-9A-Z!£&*@#_=+-]*

    并使用start(^)和end($)锚点:

    ^[a-z0-9A-Z!£&*@#_=+-]*$

    所以我们可以把它写成:

    a = '^[a-z0-9A-Z!£&*@#_=+-]*$'
    b = 0
    while b == 0:
        username = input("Enter a username: ")
        if len(username) < 6 or len(username) > 16:
            print("Incorrect length, try again.")
        else:
            if not re.search(a, username):
                print("Invalid characters entered, try again")
            else:
                print("Username accepted")
                break

    但代码仍然非常不优雅:

    1. 您使用变量b构建循环,但True更清晰;
    2. 您可以使用操作员链接来检查用户名的长度。
    3. 所以改进的代码片段看起来像:

      a = '^[a-z0-9A-Z!£&*@#_=+-]*$'
      
      while True:
          username = input("Enter a username: ")
          if not 6 <= len(username) <= 16:
              print("Incorrect length, try again.")
          elif not re.search(a, username):
              print("Invalid characters entered, try again")
          else:
              print("Username accepted")
              break

      示例会话

      Enter a username: f
      Incorrect length, try again.
      Enter a username: blablablablablablablabla
      Incorrect length, try again.
      Enter a username: foobar<>~~
      Invalid characters entered, try again
      Enter a username: fooba
      Incorrect length, try again.
      Enter a username: foobar
      Username accepted