匹配一系列模式

Matching a sequence of patterns

我有一系列模式,想要将字符串与这些模式进行匹配,return 第一组。我来自 scala 背景,但我发现自己需要在 Python 中做同样的事情。无论如何要映射和匹配一组模式?

以下是它在 scala 中的样子

 private val patterns = Stream(

Pattern.compile("([a-zA-Z\d]{9}-[a-zA-Z\d]{3})"),
Pattern.compile("([a-zA-Z\d]{3}-[a-zA-Z\d]{3}-\d{4}-\d{2})"),
Pattern.compile("([a-zA-Z\d]{5}-[a-zA-Z\d]{3}-\d{4})"),
Pattern.compile("([a-zA-Z\d]{5}-[a-zA-Z\d]{3}-\d{4})"),
Pattern.compile("([a-zA-Z\d]{3}-[a-zA-Z\d]{3}-\d{4}-\d{2})"),
Pattern.compile("([a-zA-Z\d]{5}-[a-zA-Z\d]{3}-\d{4})"),
Pattern.compile("([a-zA-Z\d!]{2,3}-[a-zA-Z\d]{2,4}-[a-zA-Z\d]{3,5}-[\d]{1,2})"),
Pattern.compile("([a-zA-Z\d]{3,6}-[a-zA-Z\d]{3}-[\d]{1,6})"),
Pattern.compile("([a-zA-Z\d]{3,6}-[a-zA-Z\d]{4}-[\d]{1,6})")
)
patterns.map(_.matcher(sku)).find(_.matches()).map(_.group(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 的列表理解,但上述方法非常符合您的代码。

它有一个缺点 - 它不会在第一个匹配项停止,而是会在返回第一个匹配项之前评估所有匹配项。