You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则能否匹配任意嵌套方括号以正确提取属性值?

问题解答

Python 原生re库不支持递归匹配语法,无法用单条通用正则覆盖任意层数的嵌套方括号提取场景,可参考以下两种可行解决方案:

方案1:使用支持递归匹配的第三方regex库

安装后可以用递归正则直接实现需求,示例代码如下:

import regex

test_str = "Prop1=a,Prop2=[Prop2_1=b,Prop2_2=c],Prop3=[Prop3_1=[Prop3_2_1=e,Prop3_2_2=f,Prop3_2_3=g],Prop3_2=d],Prop4=h"
# 替换模式中的Prop2为目标属性名即可通用
pattern = r'(?<=Prop2=)(?:\[([^\[\]]+|(?R))*\]|[^,]*)'
match_res = regex.search(pattern, test_str)
print(match_res.group())
# 输出:[Prop2_1=b,Prop2_2=c]

模式说明:

  • (?<=Prop2=) 定位到目标属性名与等号之后的匹配起始位置
  • (?:\[([^\[\]]+|(?R))*\]|[^,]*) 兼容两种值格式:
    • 嵌套括号值:从[开始,要么匹配非括号字符,要么递归匹配整个括号规则,直到对应层级的闭合]
    • 无括号普通值:直接匹配到下一个逗号为止

方案2:原生Python实现括号计数提取(无需额外依赖)

如果不想安装第三方库,通过计数括号层级的方式提取稳定性和性能更好,示例代码如下:

def extract_prop(input_str: str, target_prop: str) -> str:
    prefix = f"{target_prop}="
    start_idx = input_str.find(prefix)
    if start_idx == -1:
        return ""
    # 指针移动到等号后第一个字符
    current_pos = start_idx + len(prefix)
    bracket_level = 0
    result_chars = []
    while current_pos < len(input_str):
        current_char = input_str[current_pos]
        # 括号层级为0时遇到逗号,说明当前属性值结束
        if current_char == ',' and bracket_level == 0:
            break
        if current_char == '[':
            bracket_level += 1
        elif current_char == ']':
            bracket_level -= 1
        result_chars.append(current_char)
        current_pos += 1
    return ''.join(result_chars)

test_str = "Prop1=a,Prop2=[Prop2_1=b,Prop2_2=c],Prop3=[Prop3_1=[Prop3_2_1=e,Prop3_2_2=f,Prop3_2_3=g],Prop3_2=d],Prop4=h"
print(extract_prop(test_str, "Prop1")) # 输出a
print(extract_prop(test_str, "Prop2")) # 输出[Prop2_1=b,Prop2_2=c]
print(extract_prop(test_str, "Prop3")) # 输出[Prop3_1=[Prop3_2_1=e,Prop3_2_2=f,Prop3_2_3=g],Prop3_2=d]

内容的提问来源于stack exchange,提问作者butterflyknife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:24:04