【问题标题】:Python Regular Express Lookahead multiple conditionsPython 正则表达式 Lookahead 多个条件
【发布时间】:2015-06-19 04:38:17
【问题描述】:

我的字符串如下所示:

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)

【问题讨论】:

  • 第一个 *EQ( 去哪里以及为什么去了?
  • 您的输入似乎是一个嵌套结构,这是正则表达式不适合的工具。请:用抽象术语解释其语法或:显示并确认您正在处理的所有变体。
  • @Tomalak 添加了更多信息。你能解释一下为什么 RE 可能不是嵌套结构的好工具吗?抱歉,我是 python 新手,这个问题似乎有点傻......
  • 如果表达式之间缺少逗号,预期的行为是什么?
  • @Nip 正则表达式无法捕获嵌套。这是一个技术限制。如果您的ifFalse 可以包含无限级别,则正则表达式将无法捕获正确的结束引号。有关更多解释和替代方案,请参见此处:stackoverflow.com/questions/1099178/…。如果您四处搜索,有很多帖子讨论正则表达式和嵌套输入。

标签: python regex


【解决方案1】:
>>> 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

【讨论】:

    【解决方案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)']
    

    你可以试试这种东西。你没有提到逻辑或任何东西,所以不确定这是否可以扩展。

    【讨论】:

    • 嗨!谢谢您的帮助!我在问题中添加了更多信息,但不确定是否可以澄清。
    猜你喜欢
    • 2016-04-07
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多