我的字符串如下所示:
string = "*[EQ](@[Type],'A,B,C',@[Type],*[EQ](@[Type],D,E,F))"
理想的输出列表是:
['@[Type]', 'A,B,C', '@[Type]', '*[EQ](@[Type],D,E,F)']
所以我可以将字符串解析为:
if @[Type] in ('A,B,C') then @[Type] else *[EQ](@[Type],D,E,F)
挑战在于找到所有逗号后跟@,'要么 *。我尝试过以下代码,但它不起作用:
interM = re.search(r"\*\[EQ\]\((.+)(?=,@|,\*|,\')+,(.+)\)", string)
print(interM.groups())
编辑:
最终目标是解析输入字符串的4个组成部分:
*[EQ](Value, Target, ifTrue, ifFalse)
答案 0 :(得分:2)
x="*[EQ](@[Type],'A,B,C',@[Type],*[EQ](@[Type],D,E,F))"
print re.findall(r"@[^,]+|'[^']+'|\*.*?\([^\)]*\)",re.findall(r"\*\[EQ\]\((.*?)\)$",x)[0])
输出:
['@[Type]', "'A,B,C'", '@[Type]', '*[EQ](@[Type],D,E,F)']
你可以试试这种东西。你没有提到逻辑或任何东西,所以不确定这是否可以缩放。
答案 1 :(得分:2)
>>> import re
>>> string = "*[EQ](@[Type],'A,B,C',@[Type],*[EQ](@[Type],D,E,F))"
>>> re.split(r"^\*\[EQ\]\(|\)$|,(?=[@'*])", string)[1:-1]
['@[Type]', "'A,B,C'", '@[Type]', '*[EQ](@[Type],D,E,F)']
虽然,如果您正在寻找更强大的解决方案,我强烈推荐Lexical Analyzer,例如flex。