两个带有相同except子句的try语句

时间:2014-10-31 18:34:02

标签: python try-catch

假设我想在python 3中使用两个字符串执行某些操作,例如" A1"或" 1A"但首先检查它是否以任何一种形式存在,用户可以用两种方式键入它。 (我已经有办法检查字母是否是一封信。)

我如何以最短最简单的方式实现这一目标? 我想尝试一件事,如果失败,请在提出异常之前尝试另一件事。像这样:

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')

3 个答案:

答案 0 :(得分: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')

如果任一转换成功,则循环将被break打破。如果您没有使用break,则else循环上的for套件会被执行。

但是,您不能分配字符串索引,因为它们是不可变的。更好的选择是使用正则表达式:

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 :(得分: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()

答案 2 :(得分: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')