regex:如何在不混合输出的情况下分离已解析的元素

aurhwmvo  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(366)

我有以下两个在sql查询中解析表达式的用例: [some_date:week] 应该导致 week . week 以下是一些预先知道的关键字之一。 [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"\1", 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
ljo96ir5

ljo96ir51#

你可以用

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

查看regex演示。
重点是使用 [^][:]* -任何零个或多个字符,除了 ] , [ 以及 : -而不是 .* .
请注意 .*? 在这里也不起作用:如果两个匹配的子字符串之间存在不匹配的子字符串,则第一个匹配将比预期的长。

相关问题