代码之家  ›  专栏  ›  技术社区  ›  ʞɔıu

匹配字符串末尾的(非嵌套)平衡括号系列

  •  3
  • ʞɔıu  · 技术社区  · 15 年前

    如何匹配出现在字符串末尾的一个或多个插入式表达式?

    输入:

    'hello (i) (m:foo)'
    

    期望输出:

    ['i', 'm:foo']
    

    用于Python脚本。paren标记不能出现在彼此内部( no nesting )和括号表达式可以用空格分隔。

    这比乍一看看起来要困难,至少在我看来是这样。

    2 回复  |  直到 15 年前
        1
  •  7
  •   Markus Jarderot    15 年前
    paren_pattern = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)")
    
    def getParens(s):
      return paren_pattern.findall(s)
    

    或者更短:

    getParens = re.compile(r"\(([^()]*)\)(?=(?:\s*\([^()]*\))*\s*$)").findall
    

    解释:

    \(                     # opening paren
    ([^()]*)               # content, captured into group 1
    \)                     # closing paren
    (?=                    # look ahead for...
      (?:\s*\([^()]*\))*   #   a series of parens, separated by whitespace
      \s*                  #   possibly more whitespace after
      $                    #   end of string
    )                      # end of look ahead
    
        2
  •  5
  •   too much php    15 年前

    你不 需要 使用正则表达式:

    def splitter(input):
        return [ s.rstrip(" \t)") for s in input.split("(") ][1:]
    print splitter('hello (i) (m:foo)')
    

    注: 只有当您的输入已知有效时,此解决方案才有效。请参阅Mizardx的解决方案,该解决方案可用于任何输入。