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

标签 python sql regex regex-group python-re

我有以下两个在 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"\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

最佳答案

你可以使用

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

参见 regex demo .

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

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

关于python - 正则表达式:如何在不混合输出的情况下分离已解析的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62794442/

相关文章:

python - 单例的替代品?

python - 使用近似生成均匀分布的位

python - sys.exit(0) 和 os._exit(0) 有什么区别

python - 如何使用 Python 知道用户是否按下了 Enter 键

php - MySql PHP 从逗号分隔数据(标签)中选择不同值的计数

sql - 如何在SQL中分组并选择最小值

mysql - 'on clause' 中使用实际值过滤器的未知列

regex - 为什么 "a*a+"和 "(a{2,3})*a{2,3}"可以匹配 "aaaa"而 "(a{2,3})*"不能?

mysql - 给定 MySQL varchar 值 ages "4 to 8"或 "30+",如果我正在寻找 "5"的年龄,我该如何选择记录

正则表达式惰性量词