我可以使用regex指定一个模式,匹配正确数量的左括号和右括号吗?

  • 本文关键字:regex 可以使 模式 一个 我可以 regex
  • 更新时间 :
  • 英文 :


假设我有以下字符串:

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],...

我可以很容易地提取Prop1的值,使用模式(?<=Prop1=).*?(?=,)

对于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]

但问题是:我事先不知道我要找的东西是否嵌套,或者嵌套有多少度。

是否有一个单一的正则表达式,可以处理一般情况?

编辑有人提醒我,我需要指定哪种风格的正则表达式。我正在使用python (import re)。

不能使用re,因为它不支持递归和正则表达式子例程。您需要使用pip install regex安装PyPiregex模块,然后使用import regex as re(或import regex,然后使用regex而不是re)。

可以使用的模式是

Prop3=K(?:([(?:[^][]++|(?1))*])|[^,]*)

参见regex演示。细节:

  • Prop3=-Prop3=text
  • K-匹配重置操作符,丢弃到目前为止匹配的文本
  • (?:([(?:[^][]++|(?1))*])|[^,]*)—匹配的非捕获组
    • ([(?:[^][]++|(?1))*])-第1组:[,然后零次或多次重复[]以外的一个或多个字符或整个第1组模式递归,然后一个]字符
    • |-或
    • [^,]*-,以外的零个或多个字符
import regex
text = "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],..."
print( regex.search(r'Prop1=K(?:([(?:[^][]++|(?1))*])|[^,]*)', text).group() )
# => a
print( regex.search(r'Prop2=K(?:([(?:[^][]++|(?1))*])|[^,]*)', text).group() )
# => [Prop2_1=b,Prop2_2=c]
print( regex.search(r'Prop3=K(?:([(?:[^][]++|(?1))*])|[^,]*)', text).group() )
# => [Prop3_1=[Prop3_2_1=e,Prop3_2_2=f,Prop3_2_3=g],Prop3_2=d]

查看Python在线演示。

相关内容

最新更新