代码之家  ›  专栏  ›  技术社区  ›  Niro

匹配一系列模式

  •  0
  • Niro  · 技术社区  · 6 年前

    我有一个模式序列,希望将字符串与这些模式匹配并返回第一个组。我来自scala的背景,但我发现自己需要在Python中做同样的事情。是否有映射和匹配模式集合的方法?

     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)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Corion    6 年前

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

    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)
    

    最有可能的是,您可以使用一个更具python风格的列表理解,但是上面的方法非常适合您的代码。

    它有一个缺点-它不会停止在第一场比赛,但会评估所有的比赛之前返回第一。