2012-09-12 71 views
0

我正在编写一个程序,其中的一部分需要输入一个名称。 名称只能是字母和空格(例如John Smith),它不能是John Smith1 如果输入了无效字符,我需要程序显示错误消息并重新提出问题。除了验证之外,我已经得到了一切。我猜这是这样的吗?只允许在Python中的字符?

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 

可有人请在?????个饱,使工作方案?

+5

的Tim O'Reilly不会高兴。毛泽东也不会。 –

+0

@TimPietzcker我认为这将是一个提出任务的老师的问题。 –

+0

我会在示例代码中的if结构上使用while循环。 – Alex

回答

2

尝试字符串的isalpha()方法。

由于人将进入带有空格的名字,你有两个选择:

  1. 分割得到空间输入(使用split()
  2. string.letters

例如优势:

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

将此与一个' '得到您允许的字符的列表。由于这是作业,其余的由你决定。

+0

因空间名称失败。 –

+0

你可以将它复制到我的代码中吗?我不知道该把它放在哪里。 –

+0

我听说过isalpha()调用,但我不知道该把它放在哪里。 –

0

你可能要考虑regular expressions

^[A-Za-z ]*$ 

是一个正则表达式,只有当它们完全由ASCII字母和空格相匹配的字符串。

中,也允许你当前语言环境的字母:

^[^\W\d_]*$ 

这基本上是字母数字字符集,包括重音字符(在目前的环境)减去数字和下划线。

+0

我认为正则表达式可能不是课程的一部分。 –

+0

我认为在编程中,如果你想进步,你应该有一个实用的方法 – BlueTrin

-1

检查字符串的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 [email protected]" 
print(is_alpha_space(name)) # False 
name = " " 
print(is_alpha_space(name)) # False 
+1

-1:允许数字和下划线。 –

0

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

这将转化为这样的事情,如果我用Tim的表情:

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

您可以使用字符串的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! 

注意这也与非ASCII的字母python3:

#python3 
>>> get_name() 
name: Accented è 
Good name! 
>>> get_name() 
name: Bad Nam3 
Bad name!!! 

正则表达式是为这个简单的任务太复杂了。 也因为使用[A-Za-z ]+或类似的不会匹配非ASCII字母的名称。 并使用\w包含数字。

如果你不想匹配的非ASCII字符(如“E”),那么你可以尝试这样的事:

>>> 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 
+0

尽量不要做OP的工作,特别是因为这是作业。 –

+0

我没有读过他的评论,他说:S – Bakuriu

+0

它被标记为家庭作业:) –