我有一个字符串,我试图验证一些正则表达式模式,我希望,因为模式匹配在Python 3.10中可用,我可能能够使用它,而不是创建一个if-else块。
考虑一个字符串"validateString",其可能值为1021102、1.25.32和string021。
我尝试的代码类似于下面的代码。
match validateString:
case regex1:
print('Matched regex1')
case regex2:
print('Matched regex2')
case regex3:
print('Matched regex3')
对于正则表达式1、2和3,我尝试了字符串正则表达式模式,也重新编译对象,但似乎不起作用。
我一直试图在互联网上找到这样的例子,但似乎找不到任何涵盖正则表达式模式匹配与新的python模式匹配。
你知道我该怎么做吗?
谢谢!
4条答案
按热度按时间k4aesqcs1#
更新
我将这个答案压缩到一个python package中,以使匹配像
pip install regex-spm
一样简单,原始答案
正如Patrick Artner在other answer中正确指出的那样,目前还没有正式的方法来实现这一点,希望在未来的Python版本中引入该特性,这样这个问题就可以被淘汰了,直到那时:
PEP634指定结构模式匹配使用
==
操作符来评估匹配。我们可以覆盖它。现在,您可以执行以下操作:
re.compile
'd模式传递给case,因为Python想要基于类进行匹配,你必须先把模式保存在某个地方。组
这可以进一步扩展,以提供访问
re.Match
对象和组的简单方法。b4wnujal2#
清洁溶液
这个问题有一个干净的解决方案,只要把正则表达式从不支持它们的case子句中提升出来,放到支持任何Python对象的match子句中。
与一系列单独的正则表达式测试相比,组合后的正则表达式还能提供更好的效率,而且,正则表达式可以在匹配过程中进行预编译,以获得最大的效率。
示例
下面是一个简单的记号化器示例:
这将输出:
更好的例子
为了便于理解和添加更多案例,可以通过以详细格式编写组合正则表达式来改进代码,还可以通过命名正则表达式子模式来进一步改进代码:
可以在match/case语句中使用,如下所示:
与if/elif/else的比较
下面是使用if-elif-else链编写的等效代码:
与match/case相比,if-elif-else链速度较慢,因为它运行多个正则表达式匹配,而且没有预编译,而且没有case名称,维护性较差。
因为所有的正则表达式都是独立的,所以我们必须通过重复使用带有walrus操作符的赋值表达式来分别捕获所有的match对象,这与match/case示例中只进行一次赋值相比是很笨拙的。
ct2axkht3#
不可能使用正则模式通过结构模式匹配进行匹配(此时)。
来自:PEP 0643:结构模式匹配
PEP 634:结构模式匹配
结构模式匹配以模式的match语句和case语句的形式添加,并带有关联的操作。模式由序列、Map、原始数据类型以及类示例组成。模式匹配使程序能够从复杂的数据类型中提取信息,在数据结构上进行分支,并根据不同形式的数据采取具体行动。
这里没有给出任何提示,说明在所提供的模式上调用
re
模块的match / search函数是为了进行匹配。你可以通过阅读下面的PEP来了解更多关于结构模式匹配背后的原因:
它们还包括关于如何使用它的大量例子。
xdnvmnnf4#
下面的例子基于R. Hettinger的talk,讨论了一种类似于@ahoff的帖子的方法。
RegexEqual
是str
的直接子类,它只是覆盖了==
运算符。match-case
解决方法的介绍。