实现顺序try-excepts的pythonic方法是什么?

Juh*_*uha 4 python nested try-catch factory-pattern sequential

我必须从没有通用逻辑的文件名中解析一些数字.我想使用python的方式"尝试,你将被宽恕",或尝试 - 除了结构.现在我要添加两个以上的案例.这样做的正确方法是什么?我现在想要嵌套尝试或尝试 - 除了传递,尝试 - 除 - 传递,...哪一个会更好还是别的什么?工厂方法也许(如何?)?

这将在未来很容易扩展,因为会有更多的情况.

下面是我想要的(不起作用,因为每次尝试只能存在一个exeption):

try:
    # first try
    imNo = int(imBN.split('S0001')[-1].replace('.tif',''))
except:
    # second try
    imNo = int(imBN.split('S0001')[-1].replace('.tiff',''))
except:
    # final try
    imNo = int(imBN.split('_0_')[-1].replace('.tif',''))
Run Code Online (Sandbox Code Playgroud)

编辑:

哇,谢谢你的回答,但没有模式匹配请.我的坏,在开始时加上"一些共同的逻辑"(现在改为"没有共同的逻辑",对此抱歉).在上面的情况下,模式非常相似......让我添加一些完全不同的东西来说明问题.

except:
    if imBN.find('first') > 0: imNo = 1
    if imBN.find('second') > 0: imNo = 2
    if imBN.find('third') > 0: imNo = 3
    ...
Run Code Online (Sandbox Code Playgroud)

Nik*_* B. 10

您可以提取公共结构并列出可能的参数:

tries = [
    ('S0001', '.tif'),
    ('S0001', '.tiff'),
    ('_0_', '.tif'),
]

for sep, subst in tries:
    num = imBN.split(sep)[-1].replace(subst, '')
    try:
        imNo = int(num)
        break
    except ValueError:
        pass
else:
    raise ValueError, "String doesn't match any of the possible patterns"
Run Code Online (Sandbox Code Playgroud)

更新以回答问题编辑

通过使用lambdas,这种技术可以很容易地适应任意表达式:

def custom_func(imBN):
    if 'first' in imBN: return 1
    if 'second' in imBN: return 2

tries = [
    lambda: int(imBN.split('S0001')[-1].replace('.tif','')),
    lambda: int(imBN.split('S0001')[-1].replace('.tiff','')),
    lambda: int(imBN.split('_0_')[-1].replace('.tif','')),
    lambda: custom_func(imBN),
]

for expr in tries:
    try:
        result = expr()
        break
    except:
        pass
else:
    # error
Run Code Online (Sandbox Code Playgroud)