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
相关产品推荐
相关产品推荐

