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))*:非捕获组,匹配两种情况:[^<>]:不是<或>的普通字符(?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
相关产品推荐
相关产品推荐

