Python Regular Express Lookahead多个条件

时间:2015-06-19 04:38:18

标签: python regex

我的字符串如下所示:

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)

2 个答案:

答案 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