示例文字:
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
。
注意:
a
可以位于整个输出中的任何位置。因此在这里提取第一个a
匹配项是不可能的。谢谢。
答案 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"])