Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式仅在特定括号级别匹配模式_Python_Regex - Fatal编程技术网

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

Python 正则表达式仅在特定括号级别匹配模式,python,regex,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

示例文本:

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个accurance。在1级、2级和3级

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

注:

  • 正则表达式将用于后端用Python编写的软件中
  • 正则表达式中的递归不起作用。(仍然可以使用带有递归的正则表达式,但这不是问题的答案)
  • 级别_1
    a
    可以在整个输出中的任何位置。因此,提取第一个匹配的
    a
    在这里不是一个选项

谢谢。

也许让regex在开始时使用特定的空格进行搜索

因为它是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
我不确定您到底在寻找什么,以充分帮助…

理论上,这最多适用于3个括号级别。。如果您有足够的时间和内存来允许足够的回溯


我能够使用以下正则表达式收集级别1中的字段
a

使用递归:

 ^{((?:[^{}]|{(?1)})*)a:(\d+)
但是,Python中不支持递归,因此我删除了递归,并对其进行了更改,使其可以工作到3个嵌套级别

没有递归:

^{(?:(?:[^{}]|{(?:(?:[^{}]|{(?:(?:[^{}]|{(?:(?:[^{}])*)})*)})*)})*)a:(\d+)
使用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"])

您有一个字典…可以访问第一级使用
输出。获取(“a”)
?不,不,不。您真的不想对regex执行此操作。我正在使用一个软件进行输出分析。。这需要正则表达式来提取这些字段。我目前无法修改软件的python代码。您可以使用findall并按级别顺序遍历结果。这在(非递归)regex中是不可能的。
a
也可以出现在
输出{}
的末尾。因此,如果它是json中的第一个,它将收集级别2或级别3
a
。(参见注3)。我们可以应用的唯一条件是它应该只在第一级。
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"])