在Python中只允许字母字符?

在Python中只允许字母字符?,python,validation,character,Python,Validation,Character,我正在写一个程序,其中一部分需要输入一个名字。 名称只能是字母和空格(如John Smith),不能是John Smith 1 如果输入了无效字符,我需要程序显示错误消息并重新询问问题。除了验证,我什么都有。我猜是这样的 name = str(input("What is the customers name? ")) while True: if ??????????????????? : print("You have entered an invalid chara

我正在写一个程序,其中一部分需要输入一个名字。 名称只能是字母和空格(如John Smith),不能是John Smith 1 如果输入了无效字符,我需要程序显示错误消息并重新询问问题。除了验证,我什么都有。我猜是这样的

name = str(input("What is the customers name? "))
while True:
    if ??????????????????? :
        print("You have entered an invalid character. Enter only name."
        name = str(input("What is the customers name? "))
    else:
          break
有人可以填写
??
s使程序正常工作吗?

试试字符串法

由于此人将用空格输入姓名,因此您有两个选项:

  • 按空格分割输入(使用)
  • 利用
    string.letters
  • 例如:

       >>> import string
       >>> string.letters
       'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    
    将其与
    ''
    组合以获得允许的字符列表。既然这是家庭作业,剩下的就看你了。

    试试字符串法

    由于此人将用空格输入姓名,因此您有两个选项:

  • 按空格分割输入(使用)
  • 利用
    string.letters
  • 例如:

       >>> import string
       >>> string.letters
       'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    

    将其与
    ''
    组合以获得允许的字符列表。因为这是家庭作业,剩下的就看你了。

    你可能想看看:

    仅当字符串完全由ASCII字母和空格组成时才匹配字符串的正则表达式

    要同时允许使用当前区域设置的字母,请执行以下操作:

    ^[^\W\d_]*$
    

    这基本上是一组字母数字字符,包括重音字符(在当前语言环境中)减去数字和下划线。

    您可能需要了解:

    仅当字符串完全由ASCII字母和空格组成时才匹配字符串的正则表达式

    要同时允许使用当前区域设置的字母,请执行以下操作:

    ^[^\W\d_]*$
    

    它基本上是一组字母数字字符,包括重音字符(在当前语言环境中)减去数字和下划线。

    要检查字符串的字母,我通常使用这个字符。希望这能帮助你

    import re
    def is_alpha_space(name):
        name_nospace = ''.join((name.split()))
        if re.search(r"\W", name_nospace) or len(name_nospace) < 1:
            return False
        return True
    name = "Mark Zumkoff"
    print(is_alpha_space(name))  # True
    name = "Mark Zumkoff@"
    print(is_alpha_space(name))  # False
    name = "    "
    print(is_alpha_space(name))  # False
    
    重新导入
    def是字母空间(名称):
    name\u nospace=''.join((name.split()))
    如果重新搜索(r“\W”,name_nospace)或len(name_nospace)<1:
    返回错误
    返回真值
    name=“马克·祖姆科夫”
    打印(是否为字母空格(名称))#正确
    name=“Mark Zumkoff@”
    打印(是否为字母空格(名称))#错误
    name=“”
    打印(是否为字母空格(名称))#错误
    
    要检查字符串的alpha值,我通常使用这个。希望这能帮助你

    import re
    def is_alpha_space(name):
        name_nospace = ''.join((name.split()))
        if re.search(r"\W", name_nospace) or len(name_nospace) < 1:
            return False
        return True
    name = "Mark Zumkoff"
    print(is_alpha_space(name))  # True
    name = "Mark Zumkoff@"
    print(is_alpha_space(name))  # False
    name = "    "
    print(is_alpha_space(name))  # False
    
    重新导入
    def是字母空间(名称):
    name\u nospace=''.join((name.split()))
    如果重新搜索(r“\W”,name_nospace)或len(name_nospace)<1:
    返回错误
    返回真值
    name=“马克·祖姆科夫”
    打印(是否为字母空格(名称))#正确
    name=“Mark Zumkoff@”
    打印(是否为字母空格(名称))#错误
    name=“”
    打印(是否为字母空格(名称))#错误
    
    使用正则表达式,类似于
    [A-Za-z]+

    如果我使用Tim的表达方式,它会转化成这样:

    match = re.match(r'^[A-Za-z ]*$', name )
    if match :
        print("Correct name");
    else:
        print("Invalid chars");
    

    使用正则表达式,比如
    [A-Za-z]+

    如果我使用Tim的表达方式,它会转化成这样:

    match = re.match(r'^[A-Za-z ]*$', name )
    if match :
        print("Correct name");
    else:
        print("Invalid chars");
    

    您可以使用字符串的
    replace
    方法去除空白,然后使用
    isalpha()
    方法

    例如:

    >>> def get_name():
    ...     name = raw_input('name: ')    # use a simple "input" in python3
    ...     if not name.replace(' ', '').isalpha():
    ...             print('Bad name!!!')
    ...     else:
    ...             print('Good name!')
    ... 
    >>> get_name()
    name: My name
    Good name!
    >>> get_name()
    name: Bad Nam3
    Bad name!!!
    >>> get_name()
    name: Jon Skeet
    Good name!
    
    请注意,这也适用于python3中的非ascii字母:

    #python3
    >>> get_name()
    name: Accented è
    Good name!
    >>> get_name()
    name: Bad Nam3
    Bad name!!!
    
    正则表达式对于这个简单的任务来说太复杂了。 另外,因为使用
    [A-Za-z]+
    或类似方法无法将名称与非ASCII字母匹配。 并且使用
    \w
    包括数字

    如果您不想匹配非ASCII字母(如“è”),则可以尝试以下方法:

    >>> def get_name():
    ...     name = raw_input('name: ')   #input in python3
    ...     try:
    ...             name.encode('ascii')
    ...     except UnicodeDecodeError:
    ...             print('Bad name!!!')
    ...             return
    ...     if not name.replace(' ', '').isalpha():
    ...             print('Bad name!!!')
    ...     else:
    ...             print('Good name!')
    ... 
    >>> get_name()
    name: Accented è
    Bad name!!!
    >>> get_name()
    name: The nam3
    Bad name!!!
    >>> get_name()
    name: Guido Van Rossum
    Good name!
    
    最后,另一种检查方法是:

    >>> import string
    >>> def good_name(name):
    ...     return not set(name).difference(string.letters + ' ')
    ... 
    >>> good_name('Guivo Van Rossum')
    True
    >>> good_name('Bad Nam3')
    False
    
    您可以这样使用它:

    name = raw_input('name: ')   #input in python3
    if good_name(name):
       #stuff for valid names
    else:
       #stuff for invalid names
    

    您可以使用字符串的
    replace
    方法去除空白,然后使用
    isalpha()
    方法

    例如:

    >>> def get_name():
    ...     name = raw_input('name: ')    # use a simple "input" in python3
    ...     if not name.replace(' ', '').isalpha():
    ...             print('Bad name!!!')
    ...     else:
    ...             print('Good name!')
    ... 
    >>> get_name()
    name: My name
    Good name!
    >>> get_name()
    name: Bad Nam3
    Bad name!!!
    >>> get_name()
    name: Jon Skeet
    Good name!
    
    请注意,这也适用于python3中的非ascii字母:

    #python3
    >>> get_name()
    name: Accented è
    Good name!
    >>> get_name()
    name: Bad Nam3
    Bad name!!!
    
    正则表达式对于这个简单的任务来说太复杂了。 另外,因为使用
    [A-Za-z]+
    或类似方法无法将名称与非ASCII字母匹配。 并且使用
    \w
    包括数字

    如果您不想匹配非ASCII字母(如“è”),则可以尝试以下方法:

    >>> def get_name():
    ...     name = raw_input('name: ')   #input in python3
    ...     try:
    ...             name.encode('ascii')
    ...     except UnicodeDecodeError:
    ...             print('Bad name!!!')
    ...             return
    ...     if not name.replace(' ', '').isalpha():
    ...             print('Bad name!!!')
    ...     else:
    ...             print('Good name!')
    ... 
    >>> get_name()
    name: Accented è
    Bad name!!!
    >>> get_name()
    name: The nam3
    Bad name!!!
    >>> get_name()
    name: Guido Van Rossum
    Good name!
    
    最后,另一种检查方法是:

    >>> import string
    >>> def good_name(name):
    ...     return not set(name).difference(string.letters + ' ')
    ... 
    >>> good_name('Guivo Van Rossum')
    True
    >>> good_name('Bad Nam3')
    False
    
    您可以这样使用它:

    name = raw_input('name: ')   #input in python3
    if good_name(name):
       #stuff for valid names
    else:
       #stuff for invalid names
    

    如果Tim O'Reilly试图使用您的程序,他将不会高兴。也不会毛澤東.@TimPietzcker我想这对提出作业的老师来说是个问题。我会在示例代码中使用if构造的while循环。它只需要简单。它不需要任何这些函数。老师不知道答案。如果Tim O'Reilly试图使用你的程序,他不会高兴的。也不会毛澤東.@TimPietzcker我想这对提出作业的老师来说是个问题。我会在示例代码中使用if构造的while循环。它只需要简单。它不需要任何这些函数。老师不知道答案。你能帮我把这个复制到我的代码里吗?我不知道放在哪里。我听说过isalpha()调用,但我不知道放在哪里。可以使用
    replace(“,”)
    代替
    split()
    。因此,在OP示例中,您不应该使用“??”而应该使用“
    而不是_name.replace(“,”).isalpha()
    ,如果名称(不带空格)包含一些非字母字符,那么它是
    True
    。我尝试过替换???使用非_name.replace(“,”).isalpha()并获取语法错误。您能帮我将其复制到我的代码中吗?我不知道放在哪里。我听说过isalpha()调用,但我不知道放在哪里。可以使用
    replace(“,”)
    代替
    split()
    。因此,在OP示例中,您不应该使用“??”而应该使用“
    而不是_name.replace(“,”).isalpha()
    ,如果名称(不带空格)包含一些非字母字符,那么它是
    True
    。我尝试过替换???wi