我目前正在编写一个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
谁能解释一下这里发生了什么?
让我们从正则表达式中定义的组的拼写错误开始:看来您忘记了问号后面的冒号
(?: ...)
。
其次,您没有正确使用 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:'))