regex 我需要将配置块提取为Python dict

gojuced7  于 2023-10-22  发布在  Python
关注(0)|答案(1)|浏览(111)

我有一个数据表单项目,我需要提取.sqlx文件的配置块,并将其解析为Python字典。
我正在尝试使用RegEx。
RegEx:config\s*{[^}]*}

import re

config_pattern = r'config\s*{[^}]*}'
config_match = re.search(config_pattern, sql_content, re.DOTALL)

if config_match:
    config_block = config_match.group(0)
    print(config_block)
else:
    print("Config block not found.")

输入:

config {
    type:"table",
    schema:"xt_pto",
    name:"xt_daily_pto",
    bigquery:{
        partitionBy:"BKDate"
    },
    tags:[
        "xt_daily_pto",
        "budget"
    ]
}

WITH latest_date AS (
    SELECT MAX(dt) dt
    FROM ${ref('xt_daily_pto')}
)

SELECT ... -- Rest of my query

期望输出:

{
    "type":"table",
    "schema":"xt_pto",
    "name":"xt_daily_pto",
    "bigquery":{
        "partitionBy":"BKDate"
    },
    "tags":[
        "xt_daily_pto",
        "budget"
    ]
}

但是RegEx config\s*{[^}]*}匹配bigquery键的第一个},输出被截断:

{
    type:"table",
    schema:"xt_pto",
    name:"xt_daily_pto",
    bigquery:{
        partitionBy:"BKDate"
    }
guicsvcw

guicsvcw1#

我发现this question关于一个类似的regex问题。
修改curlies,允许它们为空,并添加“config”:

config \{(?>[^\}\{]+|(?<c>)\{|(?<-c>)\})*\}

现在这不会被解析为一个实际的python dict,因为名称周围没有引号。我想这样的方法可能会奏效:

  • 使用类似的正则表达式来捕获每个逗号分隔的元素,如果它们在一对括号中,则忽略逗号
  • 在第一个“:“处拆分每个捕获组
  • 在右半部分使用第一种模式递归,直到字符串中没有括号为止
  • 递归函数返回一个tuple,其中包含左字符串和一个dict或一个字符串,然后将其作为键值对插入到“父”dict中

不幸的是,我不是很精通正则表达式,所以我不会尝试为你做这个,但我敢打赌,你可以想出一些东西:)

相关问题