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或级别3a
。(参见注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"])