Python 寻找匹配模式,上述这种创建多个条件集合的技术也可以配合正则表达式使用。回想一下,模式的match()
方法或search()
方法会返回一个匹配对象或者None
值。可以在程序中利用这一点,如下所示:
import re
p1 = re.compile(r"(some) pattern")
p2 = re.compile(r"a (different) pattern")
from typing import Optional, Match
def matcher(text: str) -> Optional[Match[str]]:
patterns = [p1, p2]
matching = (p.search(text) for p in patterns)
try:
good = next(filter(None, matching))
return good
except StopIteration:
pass
上面定义了两种模式,并将它们应用于给定的文本块。每个模式都有一个用()标记的子模式来作为模式匹配组。
函数matcher()
会构建一系列可选模式。在本例中,它是一组简单文本对的模式。我们用生成器表达式将每个模式中的search()
方法应用于所提供的文本。由于生成器表达式是惰性求值的,因此它不会即刻执行一长串连续的模式匹配,而会先使用已得到的结果。
以None
作为第一个参数的filter()
函数会从数据序列中去除所有的None
值。filter(None, S)
得到的值与filter(lambda item: item is not None, S)
得到的值相同。
函数next()
会从函数filter()
返回的可迭代结果中获取第一个非空值。如果filter()
函数没有返回任何结果,则表示没有与之匹配的模式。在这种情况下,异常值转换为了None
结果。由于没有与给定文本匹配的模式,因此引发一个自定义的异常或许是明智的做法。
与先前的示例一样,这里展示了如何对多个布尔条件进行求值并从中选取一个真值。由于输入的是一个模式序列,因此不同函数的求值顺序是定义好的,并且严格按照顺序执行。尽管无法摆脱Python的严格求值顺序,但是一旦找到某个匹配的模式,便可以立即退出函数来控制求值的成本。