关于Python:Python – 确保输入仅包含字符A-Z的验证

Python - Validation to ensure input only contains characters A-Z

我在python3.x中创建了一个程序,它要求用户输入名字,然后输入姓氏,并将其存储在变量中,然后将变量连接到一个变量中:

1
2
3
firstName = input("What's your first name?")
lastName = input("What's your first name?")
name = firstName +"" + lastName

我试过:

1
2
3
4
5
6
7
8
while True:
    try:
        firstName = input("What's your first name?")
        lastName = input("What's your first name?")
        name = firstName +"" + lastName
        break
    except ValueError:
        print("That's invalid, please try again.")

这样可以确保输入一个字符串,但输入"bob38"、"74"或"[;p/"都将计为字符串值,因此可以接受这些值,这不是我想要的结果。

我希望有效输入只包含字母a-z/a-z(大写和小写),如果输入包含任何其他内容,则会输出一条错误消息(例如,"这是无效的,请重试"),并再次询问用户问题。我该怎么做?


您要做的是实际检查字符串是否不是isalpha(),并输出一个错误,然后继续循环,直到得到一个有效的条目。

所以,为了给你一个想法,这里有一个简单的例子:

1
2
3
4
5
6
7
while True:
    name = input("input name")
    if name.isalpha():
        break
    print("Please enter characters A-Z only")

print(name)

注意,正如本问题的注释中所述,这仅限于包含字母的名称。有几个有效的名称包含'-,在验证名称时可能需要考虑这些名称。


还有另一个解决方案。它不如使用reisalpha的效率高,但允许您轻松自定义允许的字符:

1
2
3
4
5
6
7
8
valid_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
# Just insert other characters into that string if you want to accept anything else.

while True:
    firstName = input("What's your first name?")
    if all(char in valid_characters for char in firstName):
        break
    print("That's invalid, please try again.")

all检查firstName中的所有字符是否都包含在valid_characters字符串中,如果其中任何字符不在其中,则返回False

因此,要添加空白和减号-,您可以稍微更改它:

1
2
valid_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ -'
#                      whitespace is here ------------------------------^


assert all('a'<=letter<='z' or 'A'<= letter <= 'Z' for letter in name)

如果名称中包含非字母,则会引发错误。


您可以为此使用简单的正则表达式-

1
2
3
4
5
6
7
import re
is_valid_name = r'[a-zA-Z]+'

if bool(re.match(firstName, is_valid_name)) and bool(re.match(lastName, is_valid_name)):
   name = firstName + lastName
else:
    print('thats invalid')