匹配一系列图案

时间:2018-10-08 16:23:23

标签: python regex scala design-patterns matching

我有一系列模式,想要将字符串与这些模式匹配,然后返回第一组。我来自scala背景,但发现自己需要在Python中执行相同的操作。无论如何,是否有地图来映射和匹配一组模式?

以下是在scala中的外观

line_no

1 个答案:

答案 0 :(得分:1)

这种相对忠实的音译对我有用:

import re
patterns = [
    re.compile("([a-zA-Z\\d]{9}-[a-zA-Z\\d]{3})"),
    re.compile("([a-zA-Z\\d]{3}-[a-zA-Z\\d]{3}-\\d{4}-\\d{2})"),
    re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
    re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
    re.compile("([a-zA-Z\\d]{3}-[a-zA-Z\\d]{3}-\\d{4}-\\d{2})"),
    re.compile("([a-zA-Z\\d]{5}-[a-zA-Z\\d]{3}-\\d{4})"),
    re.compile("([a-zA-Z\\d!]{2,3}-[a-zA-Z\\d]{2,4}-[a-zA-Z\\d]{3,5}-[\\d]{1,2})"),
    re.compile("([a-zA-Z\\d]{3,6}-[a-zA-Z\\d]{3}-[\\d]{1,6})"),
    re.compile("([a-zA-Z\\d]{3,6}-[a-zA-Z\\d]{4}-[\\d]{1,6})")

]

sku = "123456789-AAA"

res = filter(lambda x: x is not None, map(lambda x: x.match(sku), patterns))

print res[0].group(1)

最有可能的是,您可以使用更多的Pythonic列表理解功能,但是上述方法非常能反映您的代码。

它有一个缺点-它不会在第一个比赛中停下来,但是会在返回第一个比赛之前评估所有比赛。