我有以下两个在 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
最佳答案
你可以使用
r"\[([^][:]*):(sec|min|hour|day|date|week|month|year|aggregate)]"
参见 regex demo .
重点是使用[^][:]*
- 除 ]
以外的任何零个或多个字符, [
和 :
- 而不是 .*
.
请注意 .*?
在这里也不起作用:如果两个匹配的子串之间存在不匹配的子串,则第一个匹配 will be longer超出预期。
关于python - 正则表达式:如何在不混合输出的情况下分离已解析的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62794442/