【问题标题】:How to find multiline text between curly braces?如何在大括号之间查找多行文本?
【发布时间】:2013-08-21 10:58:45
【问题描述】:

我有下一个输入字符串:

ANIM "_NAME_KEY_" // Index = 26, AFrames = 1
    {
        0x301C
        AF  0x201C  1   0   0   FREE_ROTATE 0   FREE_SCALE_XY 100 100
    }

我怎样才能在两个花括号之间得到整个字符串,只有 _NAME_KEY_ ?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    使用选项re.MULTILINE 作为 re.compile/etc 的第二个参数。打电话。

    我会建议这个正则表达式:_NAME_KEY_[^{]*+\{([^}]+)\}

    说明:

    _NAME_KEY_:匹配“_NAME_KEY_”

    [^{]*:匹配尽可能多的非{字符(贪婪)

    \{:匹配一个{字符

    ([^}]+):匹配(并捕获)非}字符(贪婪)

    \}: 匹配一个 } 字符

    【讨论】:

    • 我正在使用query = "ANIM \"" + _KEY_NAME_ + "\".*(\s*)" + "{(\s*\w){2}\s*}" match = re.search(query, self.content, re.MULTILINE),但它只在花括号内使用 2 行。
    • 不,MULTILINE 选项只会改变锚点的行为,^$。您没有使用锚点,因此 MULTILINE 无关紧要。
    • MULTILINE 与点匹配的内容不相关吗? 编辑: 对。我没有使用点。好的,你是对的。
    【解决方案2】:
    re.findall(r'(?<={)[^}]*',str)
    

    例如

    In [5]: x="""ANIM "_NAME_KEY_" // Index = 26, AFrames = 1
        {
            0x301C
            AF  0x201C  1   0   0   FREE_ROTATE 0   FREE_SCALE_XY 100 100
        }"""
    
    In [6]: import re
    
    In [7]: re.findall(r'(?<={)[^}]*',x)
    Out[7]: ['\n        0x301C\n        AF  0x201C  1   0   0   FREE_ROTATE 0   FREE_SCALE_XY 100 100\n    ']
    

    【讨论】:

      【解决方案3】:

      使用:

      _NAME_KEY_[^{]*\{([^}]*)}
      

      结果在第一个捕获组中。您不需要使用 dotall 模式,因为此模式不使用点。

      顺便说一句,您可以像这样修剪空白:

      _NAME_KEY_[^{]*\{\s*([^}]*?)\s*}
      

      【讨论】:

        猜你喜欢
        • 2013-08-05
        • 2012-03-05
        • 2011-03-22
        • 2019-03-10
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        相关资源
        最近更新 更多