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

Python正则提取struct格式子串的多场景匹配问题求助

解决Python正则提取嵌套struct格式子串的问题

要提取字符串中符合some_var:struct<some_variables>格式的子串,且支持struct内部嵌套其他struct,普通的贪婪/非贪婪匹配无法覆盖所有场景,需要用递归正则处理嵌套的<>结构。

问题回顾

  • 贪婪匹配\w[a-zA-Z]*:struct<.*>,在多struct场景中会过度匹配,包含额外的非struct内容
  • 非贪婪匹配\w[a-zA-Z]*:struct<.*?>,遇到嵌套struct时会提前终止,导致结果不完整

解决方案:递归正则表达式

利用Python re模块支持的递归语法((?R)引用整个正则表达式),可以精准匹配嵌套的struct结构:

import re

# 匹配完整的struct格式子串,支持嵌套
pattern = r'\w+:struct<(?:[^<>]|(?R))*>,?'

正则说明

  • \w+:匹配变量名(如lastname)
  • :struct<:匹配固定的struct前缀
  • (?:[^<>]|(?R))*:非捕获组,匹配两种情况:
    1. [^<>]:不是<或>的普通字符
    2. (?R):递归匹配整个正则,处理嵌套的struct结构
  • >,?:匹配闭合的>,后面的?兼容struct在字符串末尾无逗号的情况

测试所有场景

场景1:简单struct

s='firstname:string,middlename:double,lastname:struct<last1:int,last2:array<string>>,addr:string'
match = re.search(pattern, s)
print(match.group())
# 输出:lastname:struct<last1:int,last2:array<string>>,

场景2:多个struct并列

subdtyp = 'firstname:string,middlename:double,lastname:struct<last1:int,last2:array<string>>,last3:array<string>,last4:struct<last41:int,last42:string>'
# 匹配第一个符合条件的子串
match = re.search(pattern, subdtyp)
print(match.group())
# 输出:lastname:struct<last1:int,last2:array<string>>,

# 匹配所有符合条件的子串
all_matches = re.findall(pattern, subdtyp)
for item in all_matches:
    print(item)
# 输出:
# lastname:struct<last1:int,last2:array<string>>,
# last4:struct<last41:int,last42:string>

场景3:嵌套struct

subdtyp2 = 'firstname:string,middlename:double,lastname:struct<last4:struct<last41:int,last42:string>,last2:array<string>>,last3:array<string>'
match = re.search(pattern, subdtyp2)
print(match.group())
# 输出:lastname:struct<last4:struct<last41:int,last42:string>,last2:array<string>>,

补充说明

  • 如果需要提取变量名和struct内部的内容,可以调整正则为捕获组形式:r'(\w+):struct<((?:[^<>]|(?R))*)>,?',findall会返回(变量名, 内部内容)的元组
  • 若确定每个struct后都有逗号,可将正则末尾的,?改为,, 避免匹配多余的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:55:21