假设我有以下字符串:
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=
textK
-匹配重置操作符,丢弃到目前为止匹配的文本(?:([(?:[^][]++|(?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在线演示。