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
这是我的代码,用于检查用户输入的用户名是否适合某些参数,但它无法正常工作。问题是,当我运行它时,仍然接受输入但不在允许列表中的字符。
我该如何解决这个问题?
谢谢
答案 0 :(得分:0)
这里有四个错误:
valid
和not valid
:因此,如果re.search(..)
成功,您会在屏幕上写信用户名无效; 'abcd...'
(因此'a'
后跟'b'
等等。)使用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
但代码仍然非常不优雅:
b
构建循环,但True
更清晰; 所以改进的代码片段看起来像:
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