2012-09-12 72 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

它被標記爲家庭作業:) –