正则表达式:如何在不混合输出的情况下分离已解析的元素
Regex: how to separate parsed elements without mixing the output
我有以下两个在 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"", 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 超出预期。
我有以下两个在 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"", 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 超出预期。