含浮点字符串的python结构模式匹配

1bqhqjot  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(127)

如何将结构模式匹配用于以下用例:

values = ["done 0.0", "done 3.9", "failed system busy"]

for v in values:
   vms = v.split()
   match vms:
       case ['done', float()>0]: # Syntax error
           print("Well done")
       case ['done', float()==0]: # Syntax error
           print("It is okay")
       case ['failed', *rest]:
           print(v)

请原谅我的语法错误,我写这篇文章是为了展示我的思维过程。
实现这种模式匹配的正确语法是什么?它甚至是可能的吗?

rsaldnfx

rsaldnfx1#

if ...else会更简单,但是如果你确实想要模式匹配,那么你有很多问题需要解决。你的字符串不包含浮点数,它包含一个字符串,* 可以 * 转换为浮点数。因此,要测试浮点数的值,您必须测试它是否为字符串形式的浮点数,然后转换为浮点数,再进行测试。'wildcard'字符是_,它应该用来捕获不匹配的元素,用 *_捕获任意数量的其他元素。下面的代码做了我认为你想要的,可以作为进一步开发的基础。首先,Regex被用来测试模式中带有"guard"表达式的浮点数。Regex将拾取错误条目,如"3.x "。

import re
values = ["done 0.0", "done 3.9", "failed system busy"]

for v in values:
    vms = v.split()
 
    match vms:
        case ['done', x] if x == '0.0': print(vms, 'It is OK')
        case ['done', x] if re.match(r'\d+.\d+', x) and float(x) > 3.0: print(vms, 'Well done')
        case ['failed', *_]: print(v)
        case _: print('unknown case')

产生:

['done', '0.0'] It is OK
['done', '3.9'] Well done
failed system busy

另一种不使用Regex的方法是编写一个检查函数,如下所示:

def check_float(f):
    f = f.strip()
    try:
        _ = float(f)
    except:
        return False
    return True

那么情况就是

case ['done', x] if check_float(x) and float(x) > 3.0: print(vms, 'Well done')

相关问题