匹配一系列模式
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 的列表理解,但上述方法非常符合您的代码。
它有一个缺点 - 它不会在第一个匹配项停止,而是会在返回第一个匹配项之前评估所有匹配项。
我有一系列模式,想要将字符串与这些模式进行匹配,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 的列表理解,但上述方法非常符合您的代码。
它有一个缺点 - 它不会在第一个匹配项停止,而是会在返回第一个匹配项之前评估所有匹配项。