match/case语句支持正则表达式吗?

问题描述 投票:0回答:1

我目前正在编写一个Python文本编辑器,需要将输入的行与正则表达式相匹配。我知道我可以使用链式

if
/
elif
/
else
构造,但我想知道是否可以通过使用 python 3.10 的新
match
/
case
构造来缩短我的代码。然而,Python中的
match
/
case
似乎不支持正则表达式。谁能告诉我如何使用
match
/
case
来匹配正则表达式?提前致谢! (注意:我是Python中的匹配/大小写新手,所以也许我将Python匹配/大小写误认为是其他语言中的开关/大小写。)

我尝试了以下代码,但它返回了一个错误:

import re


def match_pattern(string):
    match string:
        case re.compile(r' *if +(? *.+ *)? *: *'):
            return 'if'
        case re.compile(r' *for +\w+ +in +(? *.+ *)? *: *'):
            return 'for'
        # and other cases
        case _:
            return 'invalid'


if __name__ == '__main__':
    print(match_pattern('if (a == 0):'))
    print(match_pattern(' for i in l:'))

返回以下回溯:

Traceback (most recent call last):
  File "match_case.py", line 16, in <module>
    print(match_pattern('if (a == 0):'))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "match_case.py", line 6, in match_pattern
    case re.compile(r' *if +(? *.+ *)? *: *'):
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: called match pattern must be a type

谁能解释一下这里发生了什么?

python python-3.x pattern-matching match
1个回答
0
投票

让我们从正则表达式中定义的组的拼写错误开始:看来您忘记了问号后面的冒号

(?: ...)

其次,您没有正确使用 match-case 语句(请阅读此 PEP 636 – 结构模式匹配:教程)。如果你想在有条件的情况下使用这个语句,你需要这样重写:

import re

def match_pattern(string):
    match string:
        case string if re.match(r' *if +(?: *.+ *)? *: *',string):
            return 'if'
        case string if re.match(r' *for +\w+ +in +(?: *.+ *)? *: *',string):
            return 'for'
        # and other cases
        case _:
            return 'invalid'


if __name__ == '__main__':
    print(match_pattern('if (a == 0):'))
    print(match_pattern(' for i in l:'))
© www.soinside.com 2019 - 2024. All rights reserved.