正则表达式仅在特定括号级别匹配模式

时间:2018-07-05 06:02:43

标签: python regex

示例文字:

output : { a:1, b:2, c: { a:10, k:3 }, d:10, e: { z: {a:20, q:20 }}}
           ^              ^                           ^
         level_1        level_2                      level_3

更好的表示形式:

 { 
        a:1, //level 1
        b:2,
        c: { 
            a:10, //level 2
            k:3 
        },
        d:10,
        e: { 
            z: {
                a:20, //level 3
                q:20 
            }
        }
    }

预期的输出(a的值作为第一级的键):

  

a:1

请注意,a共有3种。在1,2和3级。

我需要一个正则表达式,如果它在第一级,则仅提取a

注意:

  • 正则表达式将用于后端使用Python编写的软件中
  • 正则表达式中的递归无效。 (仍然可以使用正则表达式进行递归操作,但在这里不能解决问题)
  • level_1 a可以位于整个输出中的任何位置。因此在这里提取第一个a匹配项是不可能的。

谢谢。

4 个答案:

答案 0 :(得分:1)

如果您有足够的时间和内存来允许足够的回溯,则理论上最多可使用3个括号。 ;-)

import re
s = 'output : { a:1, b:2, c: { a:10, k:3 }, d:10, e: { z: {a:20, q:20 }}}'
print(re.search(r'^[^{]*\{(?:[^{]*(?:\{(?:[^{]*(?:\{[^{]*\})?)*[^{]*\})?)*[^{]*(a:\s*\d+)(?:[^{]*(?:\{(?:[^{]*(?:\{[^{]*\})?)*[^{]*\})?)*[^{]*\}[^}]*$', s).groups(1))

答案 1 :(得分:0)

也许让正则表达式在开始时以特定的空格搜索?

因为它是python,并且您正在使用制表符-忽略这一行,因为我意识到它是输出而不是python脚本本身 您可以搜索

^\s\sa

因为这会搜索之前带有2个空格的a?它似乎在其中有两次制表符。但是,如果它是单个制表符,请使用一个\s(如果它是8个空格,则可以使用\s{8}

如果您要搜索“输出:{a:1,b:2,c:{a:10,k:3},d:10,e:{z:{a:20,q:20} }}” 也许尝试

\s:\s\{\sa

我不确定您要寻找的是什么,以完全帮助您...

答案 2 :(得分:0)

我能够使用以下正则表达式收集1级字段<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <canvas id="c"></canvas>

具有递归:

a

但是,Python不支持递归,因此我删除了递归并进行了更改,使其可以工作到3个嵌套级别。

无递归:

 ^{((?:[^{}]|{(?1)})*)a:(\d+)

答案 3 :(得分:0)

使用ast和regex:

import ast,re
output="{ a:1, b:2, c: { a:10, k:3 }, d:10, e: { z: {a:20, q:20 }}}"
output=re.sub(r"\b(\w+)\b:",r"'\1':",output)
d=ast.literal_eval(output)
print(d["a"])