正则表达式:如何在不混合输出的情况下分离已解析的元素

Regex: how to separate parsed elements without mixing the output

我有以下两个在 SQL 查询中解析表达式的用例:

  1. [some_date:week] 应该导致 weekweek这里是几个提前知道的关键字之一。
  2. [some_expression|condition] 应该导致 1 或任何其他不相关的字符,在这里无关紧要。

我首先想到了以下正则表达式:

r"\[(.*)\:(sec|min|hour|day|date|week|month|year|aggregate)\]"

但是,当多次出现这样的表达式时,它无法正常工作。

然后我只找到了一种使用 {,30} 来限制括号内表达式长度的方法,因此对于第二个用例,它变成了:

r"\[.{,30}\|.{,30}\]"

我觉得这不是最佳方式,期待您的建议!

编辑:这里有一些例子说明它现在是如何工作的以及它应该如何工作。

txt = """select [first:week] as time,
                [next:month] as date
         from table""" 

exp = r"\[(.*)\:(sec|min|hour|day|date|week|month|year|aggregate)\]"

print(re.sub(exp, r"", txt, flags = re.S|re.I))
    
>>  select first:week] as time,
           [next as date
    from table

应该是:

    select first as time,
           next as date
    from table

您可以使用

r"\[([^][:]*):(sec|min|hour|day|date|week|month|year|aggregate)]"

参见regex demo

要点是使用 [^][:]* - ][: 以外的任何零个或多个字符 - 而不是 .*

请注意,.*? 在这里也不起作用:如果两个匹配子串之间存在不匹配的子串,则第一个匹配项 will be longer 超出预期。