2014-10-31 38 views
1

假設我想在Python 3中用「A1」或「1A」這樣的兩個字符串做一些事情,但是首先檢查它是否以任一形式出現,因爲用戶可能會以兩種方式輸入。 (我已經有一個方法來檢查一個字符是否是一個字母)。兩個try語句,但有相同的except語句

我該如何以最短和最簡單的方式執行此操作? 我想嘗試一件事,如果失敗,請在引發異常之前嘗試另一件事。像這樣:

x = 0 
string = 'A1' 
try: 
    x = int(string[1]) # Check that second char is a digit 
    # something else to check first char is a letter 
else try: 
    x = int(string[0]) # Check that first char is a digit 
    # something else to check second char is a letter 
except: 
    print('Was in neither form') 

回答

4

你可以使用一個循環:

for i in range(1, -1, -1): 
    try: 
     string[i] = int(string[i]) 
    except ValueError: 
     pass 
    else: 
     break 
else: 
    print('Was in neither form') 

如果要麼轉換sion成功了,循環被打破了break。如果您沒有使用break,則執行for循環中的else套件。

但是,您不能指定字符串索引,因爲它們是不可變的。更好的選擇是使用正則表達式:

import re 

valid_pattern = re.compile('^(?:\d[A-Z]|[A-Z]\d)$') 
def is_valid(string): 
    return valid_pattern.match(string) is not None 
+1

爲什麼它不'break'如果輸入了'except'?它不應該在'else'中嗎? – 2014-10-31 18:42:36

+1

「except」不應該有「continue」語句嗎? – 2014-10-31 18:43:10

+0

@AlexThornton:因爲我是白癡?我忘了'else'或'continue'選項。 – 2014-10-31 18:43:17

0

你可以創建一個幫助,以減少嵌套:

def letter_and_digit(identifier): 
    a, b = identifier 

    try: 
     return a, int(b) 
    except ValueError: 
     return b, int(a) 

try: 
    letter, digit = letter_and_digit(string) 
    assert letter.isupper() 
except: 
    print('Was in neither form') 

正則表達式還有效,但可能是矯枉過正:

import re 
LETTER_DIGIT_PAIR = re.compile('^(?=.?([A-Z]))(?=.?([0-9]))..$') 
letter, digit = LETTER_DIGIT_PAIR.match('A1').groups() 
0

對於多樣性,此方法不使用try/except。它只是驗證string有且只有一個數字和一個字母:

if not (sum(c.isdecimal() for c in string) == 1 and sum(c.isalpha() for c in string) == 1): 
    print('Was in neither form')